1
我在View pager中有五个片段。其中之一是BarcodeFragment BarcodeFragment,当我在ViewPager碎片之间快速滑动时,我遇到了非常奇怪的android崩溃。我得到的崩溃是在android侧。这是日志。Android在Viewpager之间切换会产生Android崩溃
java.lang.IndexOutOfBoundsException: Invalid index 7, size is 7
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.set(ArrayList.java:481)
at android.support.v4.app.FragmentManagerImpl.makeInactive(FragmentManager.java:1169)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1078)
at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1212)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:652)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
我怀疑它的发生是因为以下几点: 每当我在barcodeFragment,我想切换到在viewpager另一个片段我用下面的代码删除片段:
if (getChildFragmentManager().findFragmentById(R.id.barcode_Fragment) != null) {
if (mBarcodeFragment != null && mBarcodeFragment.isResumed()) {
mBarcodeFragment.onDestroy();
mFragmentManager.beginTransaction().remove(mBarcodeFragment).commitAllowingStateLoss();
mBarcodeFragment = null;
}
}
每当我回到BaseScanFragment(这是调用Barcode Fragment的片段)时,我通过以下代码再次添加片段:
mBarcodeFragment = new BarcodeFragment();
getChildFragmentManager().beginTransaction().replace(R.id.barcode_Fragment, mBarcodeFragment).commit();
mBarcodeFragment.setDecodeFor(IScanResultHandler.MODE.SHOP_NOW_MODE);
mBarcodeFragment.setScanResultHandler((IScanResultHandler) getSherlockActivity());
任何人都可以猜测问题是什么?
你为什么要以这种方式删除和添加回片段? ViewPager应该负责管理内部的片段。另外,不要直接调用片段生命周期方法onDestroy。 – Okas 2014-09-25 15:10:56
我必须这样做,因为我在其他地方也使用条形码片段。条形码片段访问相机,并且在任何时候只能有一个片段的实例。所以问题是我必须删除它,然后在每次访问Scan时添加它。 – SoH 2014-09-25 15:13:13
无论如何,在你的代码中调用mBarcodeFragment.onDestroy()是不正确的。 – Okas 2014-09-25 15:16:10