java.lang.IllegalArgumentException:如果pointerIndex超出范围异常的 - dispatchTouchEvent [英] java.lang.IllegalArgumentException: pointerIndex out of range Exception - dispatchTouchEvent

查看:510
本文介绍了java.lang.IllegalArgumentException:如果pointerIndex超出范围异常的 - dispatchTouchEvent的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在延伸的FrameLayout 我的自定义视图有这样的方法

  @覆盖
公共布尔dispatchTouchEvent(MotionEvent EV){
    INT currentItem = vp.getCurrentItem();
    如果(inDragPanelZone(currentItem,ev.getX(),ev.getY())及&安培; ev.getAction()== MotionEvent.ACTION_DOWN){
        如果(!shouldAllowPaging()){
            返回true;
        }
        vp.setPagingEnabled(真正的);
    }
    返回super.dispatchTouchEvent(EV);
}
 

在一段时间后 - 我得到以下异常:

  java.lang.IllegalArgumentException:如果pointerIndex超出范围
在android.view.MotionEvent.nativeGetAxisValue(本机方法)
在android.view.MotionEvent.getX(MotionEvent.java:1995)
在android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
在android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:86)
在android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:210)
在android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1734)
在android.view.View.dispatchTouchEvent(View.java:5710)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1951)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
在MyView.dispatchTouchEvent(DraggablePane.java:176)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1918)
在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1377)
在android.app.Activity.dispatchTouchEvent(Activity.java:2391)
在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1866)
在android.view.View.dispatchPointerEvent(View.java:5890)
在android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3077)
在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2619)
在android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:983)
在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4512)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:794)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
在dalvik.system.NativeStart.main(本机方法)
 

我也尝试过使用 onInterceptTouchEvent(),得到了同样的异常。

这是一个额外的堆栈跟踪:

  java.lang.IllegalArgumentException:如果pointerIndex超出范围
    在android.view.MotionEvent.nativeGetAxisValue(本机方法)
    在android.view.MotionEvent.getX(MotionEvent.java:2013)
    在android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
    在android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:86)
    在android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:210)
    在android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1734)
    在android.view.View.dispatchTouchEvent(View.java:5724)
    在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1964)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1725)
    在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2071)
    在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
    在android.app.Activity.dispatchTouchEvent(Activity.java:2426)
    在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:2019)
    在android.view.View.dispatchPointerEvent(View.java:5904)
    在android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3155)
    在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2670)
    在android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1000)
    在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1014)
    在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2644)
    在android.os.Handler.dispatchMessage(Handler.java:99)
    在android.os.Looper.loop(Looper.java:137)
    在android.app.ActivityThread.main(ActivityThread.java:4517)
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:511)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:993)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    在dalvik.system.NativeStart.main(本机方法)
 

解决方案

目前在指针指数不检查,有时是-1 2.1(埃克莱尔)的错误。您可以创建扩展ViewPager自定义视图,覆盖的onTouchEvent和包装在一个try / catch调用super.onTouchEvent。虽然不是一个非常pretty的修复,我记得它有没有副作用(如错过的触摸事件)。

I have this method in my custom view which extends FrameLayout:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    int currentItem = vp.getCurrentItem();
    if (inDragPanelZone(currentItem, ev.getX(), ev.getY()) && ev.getAction() == MotionEvent.ACTION_DOWN) {      
        if (!shouldAllowPaging()) { 
            return true; 
        }
        vp.setPagingEnabled(true);
    }
    return super.dispatchTouchEvent(ev);
}

Once in a while - I'm getting the following Exception:

java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:1995)
at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:86)
at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:210)
at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1734)
at android.view.View.dispatchTouchEvent(View.java:5710)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1951)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at MyView.dispatchTouchEvent(DraggablePane.java:176)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1918)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1377)
at android.app.Activity.dispatchTouchEvent(Activity.java:2391)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1866)
at android.view.View.dispatchPointerEvent(View.java:5890)
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3077)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2619)
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:983)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4512)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:561)
at dalvik.system.NativeStart.main(Native Method)

I also tried using onInterceptTouchEvent() and got the same exception.

Here is an additional stacktrace:

java.lang.IllegalArgumentException: pointerIndex out of range
    at android.view.MotionEvent.nativeGetAxisValue(Native Method)
    at android.view.MotionEvent.getX(MotionEvent.java:2013)
    at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
    at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:86)
    at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:210)
    at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1734)
    at android.view.View.dispatchTouchEvent(View.java:5724)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1964)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1725)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2071)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2426)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2019)
    at android.view.View.dispatchPointerEvent(View.java:5904)
    at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3155)
    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2670)
    at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1000)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1014)
    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2644)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4517)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    at dalvik.system.NativeStart.main(Native Method)

解决方案

There is a bug in 2.1 (Eclair) where the pointer index isn't checked and is sometimes -1. You can create a custom view that extends ViewPager, override onTouchEvent and wrap the call to super.onTouchEvent in a try/catch. Whilst not a very pretty fix, I remember that it has no side effects (like missed touch events).

这篇关于java.lang.IllegalArgumentException:如果pointerIndex超出范围异常的 - dispatchTouchEvent的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆