本系列持續更新中.... 初級階段內容參考《第一行代碼》php
碎片也有本身的生命週期,而且和 Activity 的生命週期還很像。html
運行狀態java
當一個碎片可見,而且它所關聯的活動正處在運行狀態時,這個碎片也處於運行狀態。android
暫停狀態app
當一個 Activity 進入暫停狀態時,與它相關聯的可見碎片就會進入到暫停狀態。佈局
中止狀態spa
當一個活動進入了中止狀態時,與他關聯的碎片就會進入到中止狀態,或者經過調用 FragmentTransaction
的 remove()
或者 replace()
方法將碎片從活動中移除,前提是在事務提交以前調用 addToBackStack()
方法,這時碎片也會進入到中止狀態。3d
// 前提當前的 Activity 處於運行狀態。
Fragment A = new Fragment();
FragmentManager fragmentManager = getSupportFragmentManger();
FrgmentTransaction fragmentTransaction = fragmentManger.beginTransaction();
fragmentTransaction.replace(R.id.framelayout,A);// 這個時候 Fragment A應該是處於運行狀態的。
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Fragment B = new Fragment();
fragmentTransaction.replace(R.id.framelayout,B);// 這個時候 AFragment 的狀態時中止狀態的。
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
複製代碼
進入中止狀態的碎片對於用戶來講是徹底不可見的,有可能會被系統回收。code
銷燬狀態cdn
碎片老是依附於 Activity 而存在的,所以當 Activity 被銷燬時,相關聯的碎片就會進入銷燬狀態。或者經過調用 FragmentTransaction()
的 reove()
、replace()
方法將碎片從 Activity 中移除,而且在事務提交以前沒有調用 addToBackStatck()
方法,這時的碎片也會進入到銷燬狀態。
就是在上一個例子的基礎上,在每一個方法彙總打印一下,觀察一下效果就行了。
這裏給宿主 FragmentBaseActivity
和 靜態添加到 Activity 中的 Fragment 的生命週期方法裏面添加打印。效果:
在碎片中,你也是能夠經過 onSaveInstanceState() 方法來保存數據,由於進入中止狀態的碎片也是有可能被系統在內存不足的狀況下收回的。保存下來的數據在 onCreateView()
和 onActivityCreated()
和 onCreate()
中均可以獲取到
程序如何可以根據設備的分辨率或屏幕大小在運行時來決定加載哪一個佈局呢?
常用平板電腦咱們會發現有些應用都是採用雙頁模式(程序會在左側面板上顯示一個包含子項的列表,在右側的面板上顯示內容)。這是由於平板電腦屏幕的大的緣由,徹底能夠顯示兩頁的內容。可是手機就不行了,屏幕比較小,只能顯示一頁的內容。
那麼怎麼樣才能在運行時判斷程序應該使用雙頁模式仍是單頁模式呢?這就須要限定符(Qualifiers)實現。
在 activity_main.xml
中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal">
<fragment android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.example.firstcode.fourth_chapter.LeftFragment"/>
</LinearLayout>
複製代碼
這個時候讓它充滿了整個頁面。
在 res 目錄下新建 layout_large
文件夾,在這個文件夾新建一個佈局,也叫作 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal">
<fragment android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.example.firstcode.fourth_chapter.LeftFragment" android:id="@+id/fg_left"/>
<fragment android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.example.firstcode.fourth_chapter.RightFragment" android:id="@+id/fg_right"/>
</LinearLayout>
複製代碼
其中 large
就是一個限定符,那些屏幕被認爲是large
的設備就會自動加載 layout-large
文件下的佈局,而小屏幕的設備仍是會加載 layout
下的佈局。
Android 中一些常見的限定符
large
到底指多大呢?有時候咱們須要更加靈活,無論它們是否是被系統認定爲 large
這個時候就可使用最小寬度限定符(Smallest-width Qualifier)。
最小寬度限定符容許咱們指定一個最小的值(以dp爲單位),而後若是屏幕大於等於這個最小值則使用這個文件夾內的佈局,若是小於則使用默認佈局
在 res 目錄新建 layout-sw600dp
文件,在這個文件夾建立佈局就能夠了。
首先咱們要實現的效果是在普通手機上是單頁模式,也就是有一個新聞標題列表,點擊後進入下一個頁面(新聞詳情頁面)。
在平板電腦上效果是雙頁模式:效果如
試想咱們是否是能夠爲手機和平板每一個端提供一個應用程序呢?若是這樣作的話會浪費不少的人力物力,由於這樣意味着要同時維護兩份代碼。
Fragment 的出現就是爲了充分利用屏幕空間的。這裏可使用 Fragment 來不少的處理這個問題。
思路:經過限定符,在手機上面會加載直接標題列表的頁面,在平板上會加載列表和內容頁面。
其中爲了複用,標題列表和內容頁面都應該是一個 Fragment。這樣就達到了複用的效果。
實現代碼:MyGitHub/FirstCode/app/src/main/java/com/example/firstcode/fourth_chapter/news 包下
Fragment 運用在要求充分利用屏幕資源的狀況下
加載方式有靜態加載和動態加載。