IllegalStateException:<MyFragment>目前不在FragmentManager中

我知道这听起来像是FragmentStatePagerAdapter IllegalStateException的副本:<MyFragment>目前不在FragmentManager中,但他的解决方案与我的情况无关。

我很少遇到以下崩溃:

java.lang.RuntimeException: 無法 pause activity {MyActivity}:

...

Caused by: java.lang.IllegalStateException: Fragment MyFragment {40648258 id=0x7f070051} 目前不在 Android.support.v4.app.FragmentManagerImpl.putFragment(MT:516) at android.support.v4.app.FragmentStatePagerAdapter.saveState(MT:185) at android.support.v4.view.ViewPager.onSaveInstanceState(MT:881)

...

at android.view.View.saveHierarchyState(View.java:6238) at com.android.internal.policy.impl.PhoneWindow.saveHierarchyState(PhoneWindow.java:1522) at android.app.Activity.onSaveInstanceState(Activity.java:1138) at android.support.v4.app.FragmentActivity.onSaveInstanceState(MT:480) at MyActivity.onSaveInstanceState(MT:336)

这似乎是我无法理解的奇怪代码:FragmentStatePagerAdapter

for (int i=0; i<mFragments.size(); i++) {
    Fragment f = mFragments.get(i);
    if (f != null) {
        if (state == null) {
            state = new Bundle();
        }
        String key = "f" + i;
        mFragmentManager.putFragment(state, key, f);
    }
}

它看起来像适配器从中获取我的,但无法将其状态添加到 。FragmentmFragmentsFragmentManager

我无法找到任何方法在我的测试设备上重新创建它,只是从一些用户那里收到了这个。

我正在使用支持包 v4。

有什么帮助吗?谢谢。


答案 1

这是一段可怕的代码,充满了Google承认与否的错误,所以我使用此代码来修复此特定崩溃:FragmentStatePagerAdapter

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // Yet another bug in FragmentStatePagerAdapter that destroyItem is called on fragment that hasnt been added. Need to catch
        try {
            super.destroyItem(container, position, object);
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        }
    }

答案 2

如果在 ViewPager 上设置了 FragmentStatePagerAdapter,并且片段已填充,但由于在 ViewPager 的布局发生之前活动暂停,因此尚未添加到 FragmentManager 中,可能会发生这种情况。通过从 onCreate 启动另一个活动来可靠地命中此值,并将适配器也设置在 onCreate 中。在这种情况下,最好推迟设置适配器,并将其设置为活动结果。请参阅此问题:https://code.google.com/p/android/issues/detail?id=77285

我还提交了一个补丁,以在尝试保存状态之前检查是否已添加片段。


推荐