安卓中Fragment巢狀Fragment使用存在的bug
阿新 • • 發佈:2019-01-09
專案是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); } }