我在某些情况下获得此,在的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;
}
如果您ViewPager被layouted片段(不是activty)内:
mViewPager.setAdapter(新MyFragmentStatePagerAdapter(获得儿童 FragmentManager()));
我这里有同样的错误,但还有另外一个原因。
在我来说,我在我的FragmentStatePagerAdapter覆盖getItemPosition。 我IDEIA是返回的位置,如果该项目存在,或POSITION_NONE,如果它不存在了。
好了,我的问题是,当我收集了空,我回到POSITION_NONE的事实。 这打破了一切。
我的修复是返回POSITION_UNCHANGED,当我有一个空的集合。
希望它可以帮助别人。
这两个关键的东西,了解错误有:
- 它有时会发生。
- 它发生在
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片段被破坏掉了什么变化?
心动不如行动,原因是,那我每次intantiating适配器中的onResume()。
如果我实例化适配器只有一次,在活动的生命周期,这不会再发生。
这种例外意味着你试图片段附加到活动而不再附加片段正确的状态。 它的意思是,每当我们试图附加片段( 特别是通过异步调用 ),有一个小概率有人按下后退按钮和活动中的,而你正在连接的片段被破坏掉了合并。 这并不总是重复性作为它只是一个竞争条件,可能不会总是发生..
有两种方法来解决这个问题:
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 ==真 。
对我来说,原因是别的东西。
在我的Loader.onLoaderReset()
我清除从适配器的数据。 当我离开的应用程序,的onDestroy()导致加载器复位,从而扫清了FragmentStatePagerAdapter
。 我认为这导致适配器清除所有引用它的碎片,但不知何故, FragmentManager
没有注意到,扔异常。 似乎不是很符合逻辑的我。
请注意,这对我来说发生Activity.onDestroy()
希望它可以帮助别人。
在ViewPager片段是固定的,而不是试图取代适配器中的片段,试图给一组不同的片段和notifyDataSet改变,或采取的FrameLayout的优势展现在视图寻呼机选项卡的当前片段另一个片段。
还有就是我的解决方案,它的工作原理:
在片段级别应用随着ViewPager与它的滑动手势的默认刷卡功能已禁用