【问题标题】:ArrayIndexOutOfBoundsException in ViewDragHelper in AndroidAndroid 中 ViewDragHelper 中的 ArrayIndexOutOfBoundsException
【发布时间】:2014-09-22 11:22:02
【问题描述】:

我很难找出我的源代码中的错误所在。

有什么办法可以解决吗?

在我的代码中抛出了 "ArrayIndexOutOfBoundsException",但我不知道在哪里。

logcat 在 Android Studio 中:

07-29 22:31:26.745 11782-11782/com.example.petr.myapp1 E/InputEventReceiver:异常调度输入事件。 07-29 22:31:26.745 11782-11782/com.example.petr.myapp1 D/AndroidRuntime: 关闭虚拟机 07-29 22:31:26.745 11782-11782/com.example.petr.myapp1 W/dalvikvm: threadid=1: 线程退出未捕获异常 (group=0x41595ba8) 07-29 22:31:26.745 11782-11782/com.example.petr.myapp1 E/AndroidRuntime: 致命异常:主要 进程:com.example.petr.myapp1,PID:11782 java.lang.ArrayIndexOutOfBoundsException:长度=1;索引=1 在 android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(ViewDragHelper.java:1004) 在 android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:979) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1859) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 在 android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 在 android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068) 在 com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515) 在 android.app.Activity.dispatchTouchEvent(Activity.java:2458) 在 com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016) 在 android.view.View.dispatchPointerEvent(View.java:7886) 在 android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947) 在 android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) 在 android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) 在 android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 在 android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) 在 android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) 在 android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) 在 android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 在 android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532) 在 android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512) 在 android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483) 在 android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612) 在 android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 在 android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(本机方法) 在 android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176) 在 android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5585) 在 android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5631) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:542) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5001) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 在 dalvik.system.NativeStart.main(本机方法)

【问题讨论】:

标签: android debugging exception android-studio


【解决方案1】:

感谢this.,我能够解决这个问题要解决这个问题,需要在 ViewGroup 中重写两个方法。

  • requestDisallowInterceptTouchEvent(boolean disallowIntercept)
  • dispatchTouchEvent(MotionEvent ev)

requestDisallowInterceptTouchEvent 是这样设置的:

@Override
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    Log.i(TAG, "In requestDisallowInterceptTouchEvent!!!");
    mIsDisallowIntercept = disallowIntercept;
    super.requestDisallowInterceptTouchEvent(disallowIntercept);
}

在本地存储 disallowIntercept:

private boolean mIsDisallowIntercept = false;

那么dispatchTouchEvent就这样设置了:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getPointerCount() > 1 && mIsDisallowIntercept) {
        requestDisallowInterceptTouchEvent(false);
        boolean handled = super.dispatchTouchEvent(ev);
        requestDisallowInterceptTouchEvent(true);
        return handled;
    } else {
        return super.dispatchTouchEvent(ev);
    }
}

其他解决方案包括覆盖 onInterceptTouchEvent:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) { 
        if( _locked ) {
            return false;
        } else {
            try{
                return super.onInterceptTouchEvent(ev);
            }catch(IllegalArgumentException ex){
                ex.printStackTrace();
            }
        }
        return false;
}

这种方法对我没有帮助,但可能对其他人有帮助。找到了这个解决方案here.

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    Google 上https://code.google.com/p/android/issues/detail?id=182262 报告了类似问题

    但在 Android 支持库发布后,修订版 23.2.1(2016 年 3 月)此问题已解决。

    将支持库更新为Android Support Library to 23.2.1

    【讨论】:

    • 这个问题还没有解决。我在我们的应用程序中使用 Android 支持库到 23.2.1,但我们的一些三星用户在 Android 5.1.1 上仍然崩溃。这是此问题的另一个链接stackoverflow.com/questions/30986163/…
    • 我使用的是 23.4.0,仍然可以看到。最好更新已关闭的问题报告@code.google.com,还是创建一个新报告?
    • 见。我看到 23.4.0 的问题
    • 好的。我无法帮助您解决这个问题,但如果我得到解决方案,我一定会通知您。
    【解决方案3】:

    在谷歌ViewDragHelper.java saveLasMotion java.lang.ArrayIndexOutOfBoundsException查看这个问题

    在 Android 支持库 24.1.0 中似乎已解决。所以更新到那个或设置一个try catch来解决方法

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多