搜尋

首頁  >  問答  >  主體

android - java.lang.IllegalStateException: Activity has been destroyed怎么解决

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

阿神阿神2889 天前592

全部回覆(2)我來回復

  • 怪我咯

    怪我咯2017-04-17 17:40:01

    其實有一個辦法是
    if(getActivity()==null){
    return;
    }
    if(getActivity().isFishing()){
    return;
    }
    不知道你是否能理解我的意思。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:40:01

    你需要恢復FragmentManager中為你保存的fragment.
    在創建fragment之前,判斷一下savedInstanceState,像這樣:

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

    另外,我好奇你fragment嵌套的時候,是怎麼add進去的.不會也是用反射得到mChildFragmentManager然後再操作的吧?
    getChildFragmentManager()就可以得到childFragmentManager.

    具體可以參考 https://segmentfault.com/q/10...

    回覆
    0
  • 取消回覆