1. 程式人生 > ><Android基礎>(四) Fragment Part 2

<Android基礎>(四) Fragment Part 2

提交 horizon 回調方法 銷毀 inf 分享 臨界點 使用 不可

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