当前位置: 首页 > 知识库问答 >
问题:

Android中ViewDragHelper中的ArrayIndexOutOfBoundsException

吕亮
2023-03-14

我有一个问题,找出我的源代码中的错误。

有什么办法可以解决它吗?

我的代码中抛出了“ArrayIndexOutOfBoundsException”,但我无法找到它的位置。

android studio中的logcat:

07-29 22:31:26.745  11782-11782/com.example.petr.myapp1 E/InputEventReceiver﹕ Exception dispatching input event.
07-29 22:31:26.745  11782-11782/com.example.petr.myapp1 D/AndroidRuntime﹕ Shutting down VM
07-29 22:31:26.745  11782-11782/com.example.petr.myapp1 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41595ba8)
07-29 22:31:26.745  11782-11782/com.example.petr.myapp1 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.petr.myapp1, PID: 11782
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
            at android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(ViewDragHelper.java:1004)
            at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:979)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1859)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
            at android.view.View.dispatchPointerEvent(View.java:7886)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
            at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
            at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
            at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5585)
            at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5631)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:542)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            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)

共有3个答案

蔺宇
2023-03-14

看看这个问题在谷歌ViewDragHelper.javasaveLasMotionjava.lang.ArrayIndexOutOfBoundsException

它似乎在Android支持库24.1.0中得到了解决。因此更新或设置一个try-catch来解决

佘辰龙
2023-03-14

谷歌在 https://code.google.com/p/android/issues/detail?id=182262

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

将支持库更新为Android支持库更新至23.2.1

姜嘉荣
2023-03-14

多亏了这个,我才能解决这个问题。要解决这个问题,需要在ViewGroup中覆盖两种方法。

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

请求DisallowInterceptTouchEvent 是这样设置的:

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

将DisallowWintercept存储在本地:

private boolean mIsDisallowIntercept = false;

然后按如下方式设置调度TouchEvent:

@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;
}

这个方法对我没有帮助,但可能对别人有帮助。这个解决方案在这里找到了。

我希望这能有所帮助。

 类似资料:
  • 本文向大家介绍Android ViewDragHelper使用方法详解,包括了Android ViewDragHelper使用方法详解的使用技巧和注意事项,需要的朋友参考一下 帮我们实现各种类型的复杂手势操作。其实例通过静态工厂创建ViewDragHelper一般用在一个自定义ViewGroup的内部。 初始化操作 mDrragHelper=ViewDragHelper.create(this,1

  • 本文向大家介绍Android ViewDragHelper仿淘宝拖动加载效果,包括了Android ViewDragHelper仿淘宝拖动加载效果的使用技巧和注意事项,需要的朋友参考一下 拖动加载是我在淘宝的商品详情界面发现的,感觉很实用。于是就分析它的实现方式,感觉用ViewDragHelper可以很方便的实现这种效果。下面大致把我的思路分步骤写一下。先上图吧。 首先建工程什么的我就不多说了。咱

  • 本文向大家介绍Android基于ViewDragHelper仿QQ5.0侧滑界面效果,包括了Android基于ViewDragHelper仿QQ5.0侧滑界面效果的使用技巧和注意事项,需要的朋友参考一下 QQ5.0侧滑效果实现方案有很多方式,今天我们使用ViewDragHelper来实现一下。 先上效果图: ①自定义控件SlidingMenu继承FrameLayout,放在FrameLayout上

  • 本文向大家介绍Android利用ViewDragHelper轻松实现拼图游戏的示例,包括了Android利用ViewDragHelper轻松实现拼图游戏的示例的使用技巧和注意事项,需要的朋友参考一下 前言 最近一段时间看了一些介绍ViewDragHelper的博客,感觉这是一个处理手势滑动的神奇,看完以后就想做点东西练练手,于是就做了这个Android拼图小游戏。 先上个效果图 源码 https:

  • 我已经为android Studio创建了一个webview应用程序。但没有加载web URL。错误为NET::ERR_ACCESS_DENIED。有谁能帮忙吗

  • 我的年级代码是: 请帮我解决这个问题。