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”需要替换成什么,,感觉不管用呢?
En fait, une solution est
if(getActivity()==null){
return;
}
if(getActivity().isFishing()){
return;
>
Je ne sais pas si vous pouvez comprendre ce que je veux dire.
Vous devez restaurer le fragment enregistré pour vous dans FragmentManager.
Avant de créer le fragment, vérifiez l'état d'instance enregistré, comme ceci :
De plus, je suis curieux de savoir comment ajouter le fragment lorsqu'il est imbriqué. N'utilisez-vous pas également la réflexion pour obtenir le mChildFragmentManager puis l'exploiter
getChildFragmentManager()
Vous pouvez obtenir le childFragmentManager.Pour plus de détails, veuillez vous référer à https://segmentfault.com/q/10...