【问题标题】:Android Switching between Viewpager produces Android crashAndroid 在 Viewpager 之间切换会导致 Android 崩溃
【发布时间】:2014-09-25 14:58:56
【问题描述】:

我在 View 寻呼机中有五个片段。其中之一是 BarcodeFragment BarcodeFragment,当我在 ViewPager 片段之间快速滑动时,我遇到了一个非常奇怪的 android 崩溃。我遇到的崩溃是在 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(这是调用条形码片段的片段)时,我都会通过以下代码再次添加片段。:

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。
  • 我必须这样做,因为我也在其他地方使用条形码片段。 Barcode Fragment 访问 Camera 并且始终只能有一个 Fragment 实例。所以问题是我必须删除它,然后在每次访问 Scan 事物时添加它。
  • 无论如何在您的代码中调用 mBarcodeFragment.onDestroy() 是不正确的。
  • 我删除了那个......仍然是一样的东西
  • 这与您的片段和他们的交易无关,我认为您的 logcat 未完全发布。

标签: android exception arraylist android-viewpager


【解决方案1】:

我之前在处理嵌套片段时遇到过这个问题。就我而言,这是因为我使用了错误的片段管理器,即我不小心将活动片段管理器用于子片段事务

java.lang.IndexOutOfBoundsException: Invalid index 7, size is 7

索引指向发生此错误的片段,即 7。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多