Android中Fragment嵌套生命週期響應問題

問題闡述 :

主界面有四個Fragment 分別爲A、B、C、D 這些爲第一層Fragment(創建方式是由事務提交形式),其中B Fragment中佈局爲ViewPager,裏面是放的三個Fragment 分別爲B_1、B_2、B_3,這些稱爲第二層Fragment
那麼在切換第一層Fragment時候,怎樣使第二層Fragment調用其生命週期? 並且使得第一層Fragment能夠緩存View?

我們首先來看 Fragment週期圖:

由圖可以知道 Fragment生命週期觸發方式是有兩種方式:即通過事務提交方式,還有一種是通過inflate 方式,由此我們知道案例中的第二層Fragment創建方式是inflate方式,所以要想第一層B的Fragment中能調用第二層的Fragment生命週期,就需要在B中調用
getChildFragmentManager,而不能使用getFragmentManager(),另一方面雖然此時可以實現B對第二層Fragment生命週期的調用,但是並不能實現對第一層Fragment的緩存處理即對 mViewRoot的複用,想要複用就需要額外處理,見下面代碼:
如果一個Fragment內部嵌套了Fragment,內部的Fragment切換的時候要能夠調用內部Fragment的生命週期:
1、內部切換要用getChildFragmentManager
2、外部的Fragment切換的時候,onCreateView調用的時候不能緩存View,需要每次inflater.inflate纔會走子Fragment的生命週期

那麼一般情況下切換第一次層的Fragment時候,B中Fragment是不會走生命週期的,那麼如何解決這個問題尼?

1 、在B Fragment中使用getChildFragmentManager

2、在B Fragment中使用如下代碼

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

       if (!needReUseRootView() || mViewRoot == null) {
          mViewRoot = inflater.inflate(R.layout.fragment_base, container, false);
       }
    }

    protected boolean needReUseRootView() {
        return false;
    }

相應的在 第一層的其他Fragment中

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

       if (!needReUseRootView() || mViewRoot == null) {
          mViewRoot = inflater.inflate(R.layout.fragment_base, container, false);
       }
    }

    protected boolean needReUseRootView() {
        return true;
    }
發佈了79 篇原創文章 · 獲贊 62 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章