<Android基礎>(四) Fragment Part 2
4.3 Fragment的生命周期
4.3.1 Fragment的狀態和回調
1.運行狀態
當一個Fragment是可見的,並且它關聯的活動正處於運行狀態是,該Fragment也處於運行狀態
2.暫停狀態
當一個活動進入了暫停狀態時(由於另一個未占滿屏幕的活動被添加到了棧頂),與它相關的可見Fragment就會進入暫停狀態
3.停止狀態
當一個活動進入了停止狀態,與它相關聯的Fragment就會進入到停止狀態,或者通過調用FragmentTransaction的remove()、replace()方法將Fragment從活動中移除。
總的來說,進入停止狀態的Fragment對用戶來說時完全不可見的。
4.銷毀狀態
當活動被銷毀時,與它相關聯的Fragment就會進入到銷毀狀態。或者調用FragmentTransaction的remove()、replace()方法將Fragmet從活動中移除。
在事務提交之前沒有調用addToBackStack()方法,也會使Fragment進入到銷毀狀態。
Fragment的幾個回調方法
onAttach() 當Fragment和活動建立關聯的時候調用。
onCreateView() 當Fragment創建視圖(加載布局)時調用。
onActivityCreated() 確保與Fragment相關聯的活動一定已經創建完畢的時候調用。
onDestroyView() 當與Fragment相關聯的視圖被移除的時候調用。
onDetach() 當Fragment與活動解除關聯的時候調用。
Fragment完整的生命周期示意圖:
4.4 動態加載布局的技巧
4.4.1 使用限定符
運行程序判斷應該使用單頁模式還是雙頁模式,需要借助限定符(Qualifiers)來實現
Eg:
1.修改FragmentTest中的activity_main.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/left_fragment" android:name="com.example.song.fragmenttest.LeftFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
只留下一個左側Fragment並讓它充滿父布局。
2.在res目錄下新建layout-large文件夾,並新建一個布局也為activity-main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/left_fragment" android:name="com.example.song.fragmenttest.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> <fragment android:id="@+id/right_fragment" android:name="com.example.song.fragmenttest.RightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3"/> </LinearLayout>
3.layout/activity_main布局只包含一個Fragment,即單頁模式。layout-large/activity_main布局包含了兩個Fragment,即雙頁模式。
large即為一個限定符,屏幕被認為是large的設備就會自動加載layout-large文件夾下的布局
小屏幕設備則還是會加載layout文件夾下的布局
註釋掉MainActivity中replaceFragment()方法裏的代碼
運行程序:
平板和手機顯示的分別為雙頁模式和單頁模式
4.4.2 使用最小寬度限定符
最小寬度限定符(Smallest-width-Qualifier)允許對屏幕的寬度指定一個最小值(以dp為單位),然後以這個最小值為臨界點,屏幕寬度大於這個值就加載一個布局,小於這個值的設備就加載另一個布局。
res目錄下新建layout-sw600dp文件夾,然後新建activity_layout.xml布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/left_fragment" android:name="com.example.song.fragmenttest.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> <fragment android:id="@+id/right_fragment" android:name="com.example.song.fragmenttest.RightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3" /> </LinearLayout>
當程序運行的屏幕大於等於600dp時,會加載layout-600dp/activity-main.xml
當程序運行的屏幕小於600dp時,會加載默認的layout/activity-main.xml
<Android基礎>(四) Fragment Part 2