Fragment任務棧
Fragment也添加任務棧管理,從而實現多個Fragment先后添加后可以返回上一個Fragment,當activity容器內沒有Fragment時回退則退出Activity。
Activity是由任務棧管理的,遵循先進后出的原則,fragment任務棧的效果和activity一樣
- 實現方式
//必須在commit之前調用
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后頁面會出現空白
)
2.調用addToBackStack(null)將當前的事務添加到了回退棧,調用replace方法后Fragment實例不會被銷毀
,但是視圖層次會被銷毀
,即會調用onDestoryView
和onCreateView
。若需保存當前fragment視圖狀態,則可以使用hide后add新的Fragment
Activity與Fragment通信
-
activity->fragment
- 在創建fragment實例,通過
setArguments(Bundle bundle)
來實現,在Fragmetn中通過getArguments()
來獲取 - 在fragment中通過getActivity()來獲取宿主activity的對象,可以直接調用activity里的公有方法或屬性
- 廣播
- 接口
- 在創建fragment實例,通過
-
fragment->activity
- 在activity中直接獲取fragment的實例對象,可以獲取公共屬性或方法
- 接口
- 廣播
fragment->framgment
通過宿主activity來進行數據交互
Fragment重疊問題
當屏幕旋轉或者內存重啟(Fragment以及容器activity被系統回收后再打開時重新初始化)會導致Fragment重疊問題,是因為activity本身重啟的時候會恢復Fragment,然后創建Fragment的代碼又會新建一個Fragment的原因。
解決方法
:在onCreate方法中判斷參數Bundle savedInstanceState,為空時初始化Fragment實例,然后在Fragment中通過onSaveInstanceState
的方法恢復數據