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

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

阿神
阿神

闭关修行中......

membalas semua(2)
刘奇

Sebenarnya, satu cara ialah
if(getActivity()==null){
return;
}
if(getActivity().isFishing()){
return;
}
Saya tidak tahu sama ada anda boleh memahami maksud saya.

大家讲道理

Anda perlu memulihkan serpihan yang disimpan untuk anda dalam FragmentManager.
Sebelum mencipta serpihan, semak savedInstanceState, seperti ini:

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

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

Selain itu, saya ingin tahu tentang cara anda menambah serpihan apabila ia bersarang. Bukankah anda juga menggunakan refleksi untuk mendapatkan mChildFragmentManager dan kemudian mengendalikannya
getChildFragmentManager()Anda boleh mendapatkan childFragmentManager.

Untuk butiran, sila rujuk https://segmentfault.com/q/10...

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan