Activty嵌套多个Fragment,然后Fragment里面再嵌套多个Fragment,外层的Fragment切换得快了或者横竖屏切换就会报错:
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1460)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
怎么解决?
报错的是外层Fragment内的下面这段代码:
IndexListFragment indexHotFragment = new IndexListFragment();
Bundle bundle = new Bundle();
switch (id) {
case 1:
bundle.putSerializable("list", audit_handles);
bundle.putInt("id", 1);
break;
case 2:
bundle.putSerializable("list", pos_handles);
bundle.putInt("id", 2);
break;
case 3:
bundle.putSerializable("list", audit_lists);
bundle.putInt("id", 3);
break;
case 4:
bundle.putSerializable("list", pos_lists);
bundle.putInt("id", 4);
break;
default:
break;
}
indexHotFragment.setArguments(bundle);
FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(flContainer, indexHotFragment);
ft.commit();
然后我查了网上的资料,都说加下面一段:
@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);
}
}
这个方法怎么用,“mChildFragmentManager”需要替换成什么,,感觉不管用呢?
其实有一个办法是
if(getActivity()==null){
return;
}
if(getActivity().isFishing()){
return;
}
不知道你是否能理解我的意思。
你需要恢复FragmentManager中为你保存的fragment.
在创建fragment之前,判断一下savedInstanceState,像这样:
另外,我好奇你fragment嵌套的时候,是怎么add进去的.不会也是用反射得到mChildFragmentManager然后再操作的吧?
getChildFragmentManager()
就可以得到childFragmentManager.具体可以参见 https://segmentfault.com/q/10...