Fragment任務棧
Fragment也添加任務棧管理,從而實現(xiàn)多個Fragment先后添加后可以返回上一個Fragment,當activity容器內(nèi)沒有Fragment時回退則退出Activity。
Activity是由任務棧管理的,遵循先進后出的原則,fragment任務棧的效果和activity一樣
- 實現(xiàn)方式
//必須在commit之前調(diào)用
FragmentTransaction.addToBackStack(null) ;
完整代碼如下:
Fragment fg = new Fragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragment_container, fg, "tag_fragment");
ft.addToBackStack(null);
ft.commit();
- 注:
1.activity的第一個Fragment(根Fragment)可以不添加回退棧,這樣最后一個Fragment按返回時就不會空白而是直接退出activity。(若Activity中全部是fragment組成,且fragment都添加了回退棧,這樣返回到第一個fragment后頁面會出現(xiàn)空白)
2.調(diào)用addToBackStack(null)將當前的事務添加到了回退棧,調(diào)用replace方法后Fragment實例不會被銷毀,但是視圖層次會被銷毀,即會調(diào)用onDestoryView和onCreateView。若需保存當前fragment視圖狀態(tài),則可以使用hide后add新的Fragment
Activity與Fragment通信
-
activity->fragment
- 在創(chuàng)建fragment實例,通過
setArguments(Bundle bundle)來實現(xiàn),在Fragmetn中通過getArguments()來獲取 - 在fragment中通過getActivity()來獲取宿主activity的對象,可以直接調(diào)用activity里的公有方法或屬性
- 廣播
- 接口
- 在創(chuàng)建fragment實例,通過
-
fragment->activity
- 在activity中直接獲取fragment的實例對象,可以獲取公共屬性或方法
- 接口
- 廣播
fragment->framgment
通過宿主activity來進行數(shù)據(jù)交互
Fragment重疊問題
當屏幕旋轉或者內(nèi)存重啟(Fragment以及容器activity被系統(tǒng)回收后再打開時重新初始化)會導致Fragment重疊問題,是因為activity本身重啟的時候會恢復Fragment,然后創(chuàng)建Fragment的代碼又會新建一個Fragment的原因。
解決方法:在onCreate方法中判斷參數(shù)Bundle savedInstanceState,為空時初始化Fragment實例,然后在Fragment中通過onSaveInstanceState的方法恢復數(shù)據(jù)