FragmentStatePagerAdapter IllegalStateException异常

2019-06-26 00:00发布

我在某些情况下获得此,在的onResume(),它采用了FragmentStatePagerAdapter活动的。 当使用设备的后退按钮。 不总是。 不可重现。

我使用的是支持包V4,最新修订(8)。

已经搜索与谷歌,没有成功找到一个有用的答案。

展望源,它在这里抛出:FragmentManager.java

@Override
public void putFragment(Bundle bundle, String key, Fragment fragment) {
    if (fragment.mIndex < 0) {
        throw new IllegalStateException("Fragment " + fragment
                + " is not currently in the FragmentManager");
    }
    bundle.putInt(key, fragment.mIndex);
}

但是,为什么是片段<0出现的指数?

该代码实例化片段:

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;

    switch(position) {
        case 0:
            fragment = MyFragment.newInstance(param1);
            break;
        case 1:
            fragment = MyFragment2.newInstance(param2, param3);
            break;
    }
    return fragment;
}

@Override
public int getCount() {
    return 2;
}

Answer 1:

如果您ViewPager被layouted片段(不是activty)内:

mViewPager.setAdapter(新MyFragmentStatePagerAdapter(获得儿童 FragmentManager()));



Answer 2:

我这里有同样的错误,但还有另外一个原因。

在我来说,我在我的FragmentStatePagerAdapter覆盖getItemPosition。 我IDEIA是返回的位置,如果该项目存在,或POSITION_NONE,如果它不存在了。

好了,我的问题是,当我收集了空,我回到POSITION_NONE的事实。 这打破了一切。

我的修复是返回POSITION_UNCHANGED,当我有一个空的集合。

希望它可以帮助别人。



Answer 3:

这两个关键的东西,了解错误有:

  1. 有时会发生。
  2. 它发生在onResume()

鉴于这一信息,这很可能是ViewPager不保留您的状态Fragment秒。 如果您在操纵Fragment直接从S Activity ,它可能是关闭页面的情况下Fragment是被破坏掉了,你的Activity试图操纵一个null片段。 要保留Fragment的状态,即使它不是在当前屏幕,该修补程序是非常简单的:

private static final int NUM_ITEMS = 2;

ViewPager mPager = /** instantiate viewpager **/;
mPager.setOffscreenPageLimit(NUM_ITEMS-1);

你可以在这里读到它:

ViewPager片段被破坏掉了什么变化?



Answer 4:

心动不如行动,原因是,那我每次intantiating适配器中的onResume()。

如果我实例化适配器只有一次,在活动的生命周期,这不会再发生。



Answer 5:

这种例外意味着你试图片段附加到活动而不再附加片段正确的状态。 它的意思是,每当我们试图附加片段( 特别是通过异步调用 ),有一个小概率有人按下后退按钮和活动中的,而你正在连接的片段被破坏掉了合并。 这并不总是重复性作为它只是一个竞争条件,可能不会总是发生..

有两种方法来解决这个问题:

1)这种情况发生时您在活动的onSaveInstanceState被称为并发布到网上,你试图附加的片段,由于Android不会现在能够保存片段的状态,它会抛出异常。 为了克服这一点,如果你不保存片段的状态,请尝试使用

commitAllowingStateLoss(),同时提交事务。

2)是非常安全的,请检查您的行为是否是正确状态还是不重视片段之前,在使用的onPause下面的代码:

    boolean isInCorrectState;

    public void onCreate{
    super.onCreate();
    isInCorrectState = true;
    }

    public void onPause() {
    super.onPause();
      if(isFinishing()){
        isInCorrectState = false;
       }
    }

现在,使用此标志来检查,如果你的活动是正确的状态,或不重视的片段之前..含义附加片段IFF isInCorrectState ==真



Answer 6:

对我来说,原因是别的东西。

在我的Loader.onLoaderReset()我清除从适配器的数据。 当我离开的应用程序,的onDestroy()导致加载器复位,从而扫清了FragmentStatePagerAdapter 。 我认为这导致适配器清除所有引用它的碎片,但不知何故, FragmentManager没有注意到,扔异常。 似乎不是很符合逻辑的我。

请注意,这对我来说发生Activity.onDestroy()

希望它可以帮助别人。



Answer 7:

在ViewPager片段是固定的,而不是试图取代适配器中的片段,试图给一组不同的片段和notifyDataSet改变,或采取的FrameLayout的优势展现在视图寻呼机选项卡的当前片段另一个片段。

还有就是我的解决方案,它的工作原理:

在片段级别应用随着ViewPager与它的滑动手势的默认刷卡功能已禁用



文章来源: FragmentStatePagerAdapter IllegalStateException: is not currently in the FragmentManager