android Fragment 狀態管理

1.對父activity附加和分離fragments分別通過onAttach和onDetach

fragment/activity 到了pause狀態,onDetach是有可能不被調用就掛了,因爲父activity的進程可能因爲資源緊張被殺死。(意外死亡)

onAttach一般是用來獲取對父activity的引用。(因爲你可能需要用到父activity來初始化你的一些東西)

2.創建和銷燬Fragments

與activity一樣,你應該使用onCreate方法去初始化你的fragments。(onCreate方法在整個生命週期只執行1次)。

注意:不像activity,fragment的ui初始化可不在onCreate方法中,而是onCreateView.

如果fragment需要與父activtiy的UI交互,那麼你需要等onActivityCreate方法觸發纔可以,因爲這個方法意味着你的activity已經完整初始化好了。

3.Fragment狀態

再次強調,fragment的命運與activity是息息相關的。因此,fragment的狀態常常要去參考activity的狀態,因爲要保持一致。

當activities獲取到焦點,那麼它所含的fragments也能獲取到焦點。當activity暫停或者停止,fragments也暫停或者停止 。。。。。等等,當activity死掉了,fragment必須死。

4.Fragment Manager

每個activity包含一個fragment manager去管理它所包含的fragments. 你可以獲取fragment manager通過getFragmentManager方法。

FragmentManager fragmentManager = getFragmentManager()

FragmentManager提供方法去獲取和使用Fragments和執行Fragment事務:增加,移除,或者代替Fragments.

1.增加Fragments到Activities

最簡單的方式,當然XML嘍,直接例子不解釋了:(tag或者id是必須給一個的,便於後期查找,也便於activity重啓的時候系統用來恢復

02               android:orientation=”horizontal”
03               android:layout_width=”match_parent”
04               android:layout_height=”match_parent”>
05               <fragment android:name=”com.paad.weatherstation.MyListFragment”
06                 android:id=”@+id/my_list_fragment”
07                 android:layout_width=”match_parent”
08                 android:layout_height=”match_parent”
09                 android:layout_weight=”1
11               <fragment android:name=”com.paad.weatherstation.DetailsFragment”
12                 android:id=”@+id/details_fragment”
13                 android:layout_width=”match_parent”
15                 android:layout_height=”match_parent” 
16                 android:layout_weight=”3” 

5.使用Fragment事務:

事務可以用來增加,移除,替換Fragments. 使用事務可以使你的佈局動態化,可以基於用戶的交互和APP的狀態做適應和改變。它們還支持指定顯示的過渡動畫和是否去包含事務在Back Stack。

使用beginTransaction一個新的Fragment事務(FragmentManager的方法)。如果需要,在你設置顯示的動畫前,可以使用add,remove,replace方法修改佈局和設置合適的back-stack行爲。當你準備好改變的時候,使用commit去提交到UI隊列中。

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

// Add, remove, and/or replace Fragments. 
// Specify animations. 
// Add to back stack if required.

fragmentTransaction.commit();

增加、移除或者代替Fragments:

add:  

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.add(R.id.ui_container, new MyListFragment());  
fragmentTransaction.commit();

注意!!!:fragment沒視圖時,你只能指定tag(add(Fragment fg,String tag)),如果有視圖,tag和id都可以。

首先必須明白,既然是動態添加的,我怎麼知道該加到佈局的哪部分,所以這裏要指定父佈局容器的ID,R.id.ui_container。

remove:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
Fragment fragment = fragmentManager.findFragmentById(R.id.details_fragment); 
fragmentTransaction.remove(fragment); 
fragmentTransaction.commit();

replace:

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  
fragmentTransaction.replace(R.id.ui_container, new DetailFragment(selected_index)); //還有個重載方法,可以爲新的fragment指定tag 
fragmentTransaction.commit(); 
//這裏也解釋爲什麼無視圖的不能有id,沒有視圖哪來的父容器? 所以也不能findFragmentByID

發佈了15 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章