1. 程式人生 > >安卓中Fragment巢狀Fragment使用存在的bug

安卓中Fragment巢狀Fragment使用存在的bug

專案是fragment巢狀fragment,最初的時候在fragment  viewpager中的第一個fragment中巢狀fragment viewpager 其他是fragment 沒有什麼問題,後邊需求改變,在第一個fragment中巢狀的fragment viewpager 要移動到第三個fragment中,意思就是第一個fragment viewpager與第三個fragment換一下位置(這需求也是簡直了),然後就著手改,改著改著就出問題了,改完之後,第三個fragment viewpager頁就經常出現空白或錯位,異常是 java.lang.IllegalStateException: No activity

首先我們來分析一下Exception出現的原因:

通過DEBUG發現,當第一次從一個Activity啟動Fragment,然後再去啟動子Fragment的時候,存在指向Activity的變數,但當退出這些Fragment之後回到Activity,然後再進入Fragment的時候,這個變數變成null,這就很容易明瞭為什麼丟擲的異常是No activity

這個Exception是由什麼原因造成的呢?如果想知道造成異常的原因,那就必須去看Fragment的相關程式碼,發現Fragment在detached之後都會被reset掉,但是它並沒有對ChildFragmentManager做reset,所以會造成ChildFragmentManager的狀態錯誤。

找到異常出現的原因後就可以很容易的去解決問題了,我們需要在Fragment被detached的時候去重置ChildFragmentManager,即

mAdapterPager = new FragmentPagerItemAdapter(getChildFragmentManager(), mPagesFragment);
@Override
public void onDetach() {

    super.onDetach();

    try {

        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");

        childFragmentManager.setAccessible(true);

        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {

        throw new RuntimeException(e);

    } catch (IllegalAccessException e) {

        throw new RuntimeException(e);

    }

}