Java.lang.IllegalArgumentException: pointerIndex fuera de rango Exception – dispatchTouchEvent

Tengo este método en mi vista personalizada que se extiende 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); } 

De vez en cuando – estoy recibiendo la siguiente Excepción:

 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) 

También intenté usar onInterceptTouchEvent() y conseguí la misma excepción.

Aquí hay un stacktrace adicional:

 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) 

Hay un error en 2.1 (Eclair) donde el índice del puntero no está marcado y es a veces -1. Puede crear una vista personalizada que expanda ViewPager, anule onTouchEvent y envuelva la llamada a super.onTouchEvent en un try / catch. Aunque no es una solución muy bonita, recuerdo que no tiene efectos secundarios (como eventos de toque perdidos).

Agregando a la respuesta anterior También puede intentar Superponer método onInterceptTouchEvent y surround super.onInterceptTouchEvent (ev) con try and catch trabajado para mí en un ViewPager

 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { try { return super.onInterceptTouchEvent(ev); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } return false; } 
  • ¿Agregar y quitar vistas en Android dinámicamente?
  • El relleno no funciona con ciertos recursos de fondo
  • Android Establecer el texto alinear a la mitad de la tostada
  • Cómo restaurar correctamente el estado de vista después de rotaciones
  • Cómo deshabilitar la caché de dibujo?
  • Obtener el nombre de la vista de forma programática en Android
  • ¿Por qué http://schemas.android.com/apk/res-auto "sólo funciona para proyectos de biblioteca?
  • Android Ver setPadding () vs setPaddingRelative ()
  • Añadir vista a un fragmento dinámicamente en Android?
  • XY errónea al dibujar CircularImage
  • En la aplicación Google Play, ¿cómo se implementa el ViewGroup que muestra las listas superiores de aplicaciones?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.