FragmentStatePagerAdapter IllegalStateException:<MyFragment>当前不在FragmentManager中

Ixx*_*Ixx 28 android fragment

我在一些使用FragmentStatePagerAdapter的活动的onResume()中获得了这个.使用设备的后退按钮时.不总是.不可重复.

我正在使用支持包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);
}
Run Code Online (Sandbox Code Playgroud)

但是为什么片段的索引<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;
}
Run Code Online (Sandbox Code Playgroud)

我也无法通过源调试,因为支持包不允许我附加源,出于某种原因......但这是一个不同的问题......

小智 15

如果你的ViewPager被放置在一个片段(而不是一个

激活)中:mViewPager.setAdapter(new MyFragmentStatePagerAdapter(get Child FragmentManager()));

  • 没有为我工作.我有一个嵌套的viewpager,我在父片段中使用getChildFragmentManager()方法.使用该方法抛出异常. (3认同)
  • 这次真是万分感谢.这个"getChildFragmentManager()"确实工作正常! (2认同)
  • 这节省了我的一天! (2认同)

小智 10

我在这里遇到了同样的错误,但另一个原因.

在我的例子中,我在FragmentStatePagerAdapter中覆盖了getItemPosition.我的意思是如果项目存在则返回位置,或者如果它不存在则返回POSITION_NONE.

好吧,我的问题是,当我的收藏品变空时,我返回了POSITION_NONE.这打破了一切.

我的修复是当我有一个空集合时返回POSITION_UNCHANGED.

希望它可以帮助别人.


Ale*_*ood 8

理解这个bug的两个关键事项是:

  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);
Run Code Online (Sandbox Code Playgroud)

你可以在这里读到它:

ViewPager碎片会随着时间的推移而被破坏?

  • 所有这些片段的东西真的很可怕,我已经有4个不同的例外,都与尝试访问不再存在的东西有关"片段不再存在","没有找到id 0xcf片段的视图","片段不再在片段管理器"(并忘记了第4个).堆栈跟踪甚至没有显示我的代码的任何行,并且没有关于这个的有用指南或示例,只是一些非常简单的教程,它们始终有效.但是一旦它变得更复杂......繁荣. (28认同)
  • 我不理解抛出异常的逻辑,因为ViewPager没有保留片段的状态......如果片段被破坏,为什么ViewPager不只是重新创建它?无论如何,每次我加载活动时我都会设置一个实例化片段的新适配器,我不明白它为什么还在尝试访问其他片段........... (2认同)
  • 我不是百分之百确定研究来源会有所帮助......我从来没有觉得我已经实现了100%的工作解决方案而只是等待我的应用程序随机打破我,因为我做的修复感觉不可靠......但也许我确实正确地实现了它,谁知道呢.我所知道的是文档不是很清楚`ViewPager`如何管理它的容器碎片所以也许研究文档可以让你更深入地了解它... (2认同)

Ixx*_*Ixx 5

知道了,原因是,我每次都在onResume()中对适配器进行实例化.

如果我仅在活动的生命周期中实例化适配器一次,则不会再发生这种情况.