android - java.lang.IllegalStateException: Activity has been destroyed怎么解决
阿神
阿神 2017-04-17 17:38:01
0
2
586

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”需要替换成什么,,感觉不管用呢?

阿神
阿神

闭关修行中......

répondre à tous(2)
刘奇

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 :

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {

        super.onViewStateRestored(savedInstanceState);
        if (savedInstanceState != null) {
            FragmentManager fm = getChildFragmentManager();
            // tag 是你在add fragment的时候穿进去的值.
            mFragment = (Fragment) fm.findFragmentByTag(tag);
        }
    }

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...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal