Fragment本身以及他跟activity的交互

Fragment翻譯過來就是碎片的意思,他能夠作為一個組件的存在,拼湊出一個界面來,意味著activity很多部分可以抽成一個個碎片,以便能夠復用。
關于fragment的生命周期,用一張圖來展示就可以了。

3416944-eefed5297398cdfb.jpg

以下說一些重點:
1.Fragment在onAttach 開始跟Activity window綁定,這個時候 就已經可以通過getActivity來拿到activity實例了。
2.fragment去inflate一個xml一般在onCreateView那邊 ,不過也可以在onCreate里面inflate,然后在onCreateView去return ,這取決于你的想法,跟界面的布局。
3.fragment跟activity綁定后,他的生命周期依賴于activity,那么意味著,activity中有多個fragment,通過viewpager和其adapter進行控制,當hide一個fragment,show一個fragment時,他的onResume方法可能不會被調用,因為沒有影響到activity的生命周期。
4.在生命周期方面,activity和fragment之間一個很重要的不同就是在各自的后臺棧中是如何存儲的。當activity停止時,默認情況下activity被安置在由系統管理的activity后臺棧中;fragment僅當在一個事務被移除時,通過顯式調用addToBackStack()請求保存的實例,該fragment才被置于由宿主activity管理的后臺棧。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { 
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment,
container, false);
}

inflate()函數需要以下三個參數:
(1).要inflate的布局的資源Id
(2).被inflate的布局的父ViewGroup
(3).一個布爾值,表明在inflate期間被inflate的布局是否應該附上ViewGroup(第二個參數container)。(在這個例子中傳入的是false,因為系統已經將被inflate的布局插入到容器中(container)——傳入true會在最終的布局里創建一個多余的ViewGroup)

5.在android中,對fragment的事務操作都是通過FragmentTranSaction來執行。操作大致可以分為兩類:
1:>顯示:add(), replace(), show(), attach()
2:>隱藏:remove(), hide(), detach()
說明:調用show() & hide()方法時,Fragment的生命周期方法并不會被執行,僅僅是Fragment的View被顯示或者?隱藏。執行replace()時(至少兩個Fragment),會執行第二個Fragment的onAttach()方法、執行第一個Fragment的onPause()-onDetach()方法,同時containerView會detach第一個Fragment的View。add()方法執行onAttach()-onResume()的生命周期,相對的remove()就是執行完成剩下的onPause()-onDetach()周期。

6.關于onSaveInstanceState(Bundle outState),此方法是在fragment或者activity可能被銷毀的情況下 ,就會被調用,即系統不清楚你的這次操作會不會帶來銷毀的結果,那么就會調用這個方法,比如按home鍵,界面跳轉 等,并且 onRestoreInstanceState方法并不是一定對應的,意味著 前者被執行后,后者并不一定會被執行到。

7.對于一些外界傳進來的參數,記得用onSaveInstanceState保存一下,不然內存不足的情況下,很容易被回收掉,導致參數不存在,而顯示空白。

8.FragmentTransaction 可以做fragment的替換,獲取事物之后,還可以設置 進出的動畫。還有在調用commit()之前,可以將事務添加到fragment事務后臺棧中(通過調用addToBackStatck())。這個后臺棧由activity管理,并且允許用戶通過按BACK鍵回退到前一個fragment狀態。
當移除一個fragment時,如果調用了addToBackStack(),那么之后fragment會被停止,如果用戶回退,它將被恢復過來。
調用commit()并不立刻執行事務,相反,而是采取預約方式,一旦activity的界面線程(主線程)準備好便可運行起來。然而,如果有必要的話,你可以從界面線程調用executePendingTransations()立即執行由commit()提交的事務。

9.下面的代碼中一個fragment代替另一個fragment,并且將之前的fragment狀態保留在后臺棧中:

Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();

10.只能在activity保存狀態(當用戶離開activity時)之前用commit()提交事務。如果你嘗試在那時之后提交,會拋出一個異常。這是因為如果activity需要被恢復,提交后的狀態會被丟失。對于這類丟失提交的情況,可使用commitAllowingStateLoss()。

11.管理Fragment回退棧

跟蹤回退棧的狀態
我們通過實現OnBackStackChangedListener接口來實現回退棧狀態跟蹤,具體代碼如下:

//implements接口
public class XXX implements FragmentManager.OnBackStackChangedListener 
//實現接口所要實現的方法
@Override
public void onBackStackChanged() {
  //do whatevery you want
}
//設置回退棧監聽接口
getSupportFragmentManager().addOnBackStackChangedListener(this);

管理回退棧
(1).FragmentTransaction.addToBackStack(String)
將一個剛剛添加的Fragment加入到回退棧中
(2).getSupportFragmentManager().getBackStackEntryCount()
獲取回退棧中的實體數量
(3).getSupportFragmentManager().popBackStack(String name, int flags)
根據name立刻彈出棧頂的fragment
(4).getSupportFragmentManager().popBackStack(int id, int flags)
根據id立刻彈出棧頂的fragment
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容