我想了解此异常,以实现适当的修复程序。

有一个ViewPager,它使用FragmentStatePagerAdapter通过getItem和MyFragmentClass.newInstance(...)实例化2个片段。

适配器的getItem如下所示:

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

    switch(position) {
        case 0:
            fragment = MyFragment2.newInstance(par1);
            break;
        case 1:
            fragment = MyFragment2.newInstance(par2, par3);
            break;
    }
    return fragment;
}

问题:

当 Activity 被销毁并再次创建时,适配器再次被实例化,使用MyFragmentClass.newInstance(...)再次创建了片段……但是在这一行:
pager.setAdapter(adapter);
我得到了提到的异常。

我查看了引发异常的源代码,就是这样:
@Override
public Fragment getFragment(Bundle bundle, String key) {
    int index = bundle.getInt(key, -1);
    if (index == -1) {
        return null;
    }
    if (index >= mActive.size()) {
        throw new IllegalStateException("Fragement no longer exists for key "
                + key + ": index " + index);
    }
    Fragment f = mActive.get(index);
    if (f == null) {
        throw new IllegalStateException("Fragement no longer exists for key "
                + key + ": index " + index);
    }
    return f;
}

因此,一个包被传递到那里,带有一些引用我的旧片段的状态,但这并不对应于当前状态(mActive),并且引发了异常。

我不明白这背后的想法是什么,或者我应该以哪种方式实例化片段。

我尝试了从另一个上下文中获得的技巧:
pager.setOffscreenPageLimit(1);
为了避免碎片在屏幕外时被破坏(在使用2页viewpager的情况下,尽管不知道状态适配器是否可以很好地工作)。但是似乎没有相关性,至少,它没有帮助,仍然会得到相同的异常。

捕获异常会导致页面空白。

最佳答案

这可以帮助-

@Override
public Parcelable saveState() {
    return null;
}

FragmentStatePagerAdapter中添加上面的行。

10-07 20:49