【发布时间】:2012-07-30 03:55:28
【问题描述】:
我想了解这个异常以便实施适当的修复。
有一个 ViewPager,它使用 FragmentStatePagerAdapter 通过 getItem 和 MyFragmentClass.newInstance(...) 实例化 2 个片段。
Adapter 的 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的情况下,虽然不知道它是否适用于状态适配器)。但是好像没有关系,至少,没用,还是报同样的异常。
捕获异常会导致页面空白。
【问题讨论】:
-
您找到解决问题的有效方法了吗?
-
你找到解决办法了吗
-
我不记得了,抱歉:(
-
这个问题是 2 年前提出的。如今,使用了 AppcompatActivity 和支持片段。使用 setRetianInstance(true);并记住使用方向上的现有项目重新创建适配器。如果您不重新创建适配器,它将尝试使用垃圾上下文,这将导致崩溃。