Fragment的使用注意事項

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實例不會被銷毀,但是視圖層次會被銷毀,即會調用onDestoryViewonCreateView。若需保存當前fragment視圖狀態,則可以使用hide后add新的Fragment

Activity與Fragment通信

  • activity->fragment

    • 在創建fragment實例,通過setArguments(Bundle bundle)來實現,在Fragmetn中通過getArguments()來獲取
    • 在fragment中通過getActivity()來獲取宿主activity的對象,可以直接調用activity里的公有方法或屬性
    • 廣播
    • 接口
  • fragment->activity

    • 在activity中直接獲取fragment的實例對象,可以獲取公共屬性或方法
    • 接口
    • 廣播
  • fragment->framgment
    通過宿主activity來進行數據交互

Fragment重疊問題

當屏幕旋轉或者內存重啟(Fragment以及容器activity被系統回收后再打開時重新初始化)會導致Fragment重疊問題,是因為activity本身重啟的時候會恢復Fragment,然后創建Fragment的代碼又會新建一個Fragment的原因。

解決方法:在onCreate方法中判斷參數Bundle savedInstanceState,為空時初始化Fragment實例,然后在Fragment中通過onSaveInstanceState的方法恢復數據

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容