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