bug_ _ java.lang.IllegalArgumentException: pointerIndex out of range 问题的两种解决办法

========== 4     如何解决java.lang.IllegalArgumentException: pointerIndex out of range?

今天遇到一个bug:java.lang.IllegalArgumentException: pointerIndex out of range

	at android.view.MotionEvent.nativeGetAxisValue(Native Method)
	at android.view.MotionEvent.getX(MotionEvent.java:1981)
	at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
	at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:91)
	at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:219)
	at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1901)
	at cn.xs8.app.activity.news.ui.CustomViewPager.onTouchEvent(CustomViewPager.java:29)
	at android.view.View.dispatchTouchEvent(View.java:7263)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2235)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1932)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
	at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1977)
	at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1427)
	at android.app.Activity.dispatchTouchEvent(Activity.java:2428)
	at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1925)
	at android.view.View.dispatchPointerEvent(View.java:7443)
	at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3603)
	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3531)
	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4783)
	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4743)
	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4895)
	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
	at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
	at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171)
	at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4863)
	at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4917)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
	at android.view.Choreographer.doCallbacks(Choreographer.java:579)
	at android.view.Choreographer.doFrame(Choreographer.java:546)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
	at android.os.Handler.handleCallback(Handler.java:800)
	at android.os.Handler.dispatchMessage(Handler.java:100)
	at android.os.Looper.loop(Looper.java:194)
	at android.app.ActivityThread.main(ActivityThread.java:5371)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:525)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
	at dalvik.system.NativeStart.main(Native Method)

     在网上很多关于该bug的处理都众说纷纭,我在这里不再详述该bug产生的原因,下面给出一种在4.1的机子上测试通过的方案:

1.让你的view(可能是ScrollView,WebView,MapView等),创建一个子view继承于它们中的某一个;

2.重写onInterceptTouchEvent 和onTouchEvent方法

3.try catch 该两个方法,形如下面:

try{  

    super.onInterceptTouchEvent(MotionEvent ev)  

} catch(ILLegalArgumentException ex) {  

}  

    return false;  

  

try{  

    super.onTouchEvent(MotionEvent ev)  

} catch(ILLegalArgumentException ex) {  

}  

    return false;  

========= 3 

在ViewPager里缩放图片过小出的异常,自己看了网上的方法:

1.让你的view(可能是ScrollView,WebView,MapView等),创建一个子view继承于它们中的某一个;

2.重写onInterceptTouchEvent 和onTouchEvent方法

3.try catch 该两个方法,形如下面:

try{

    super.onInterceptTouchEvent(MotionEvent ev)

} catch(ILLegalArgumentException ex) {

}

return false;

 

try{

 super.onTouchEvent(MotionEvent ev)

} catch(ILLegalArgumentException ex) {

}

return false;

Tips:但是有点问题,如果是用ViewPager的话,onInterceptTouchEvent 返回false会导致ViewPager翻页出现BUG

  1. import android.content.Context;  
  2. import android.support.v4.view.ViewPager;  
  3. import android.util.AttributeSet;  
  4. import android.view.MotionEvent;  
  5. /** 
  6.  * ViewPager类,(此类只是为了防止双指缩放过小而出异常) 
  7.  * @author  
  8.  * 
  9.  */  
  10. public class ImageViewPager extends ViewPager {  
  11.   
  12.     public ImageViewPager(Context context) {  
  13.         super(context);  
  14.     }  
  15.       
  16.     public ImageViewPager(Context context, AttributeSet attrs) {  
  17.         super(context, attrs);  
  18.     }  
  19.   
  20.     @Override        
  21.     public boolean onInterceptTouchEvent(MotionEvent arg0) {  
  22.         boolean b = false;  
  23.         try {  
  24.             b = super.onInterceptTouchEvent(arg0);  
  25.         } catch (Exception e) {  
  26.               
  27.         }  
  28.         return b; //网上看的方法是直接返回false,但是会导致ViewPager翻页有BUG  
  29.     }  
  30.       
  31.     @Override  
  32.     public boolean onTouchEvent(MotionEvent arg0) {  
  33.         try {  
  34.             super.onTouchEvent(arg0);  
  35.         } catch (Exception e) {  
  36.               
  37.         }  
  38.         return false;  
  39.     }  
  40.   
  41. }  
[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"   
  5.     >  
  6.     <!-- ViewPager用自己定义的 -->  
  7.     <com.ghl.components.ImageViewPager  
  8.         android:id="@+id/show_image_viewpager"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.         android:background="#4000"  
  12.         />  
  13.           
  14.     <include layout="@layout/image_selector_titlebar"/>  
  15.     <include layout="@layout/image_selector_bottom"/>  
  16.   
  17. </RelativeLayout>  

我是这样处理ViewPager翻页就没问题了。

======= 2 

转载请注明:http://blog.csdn.net/aaawqqq

Android   java.lang.IllegalArgumentException: pointerIndex out of range  

bug: 

 
  1. 11-27 00:12:55.029: E/AndroidRuntime(22447): java.lang.IllegalArgumentException: pointerIndex out of range  
  2. 11-27 00:12:55.029: E/AndroidRuntime(22447):      at android.view.MotionEvent.nativeGetAxisValue(Native Method)  

原因

绘图的时候 多点触控 放大缩小 导致一场 , 我在viewpager 里面  通过手势绘制图片 放大缩小 造成了这个bug

我的 viewpager 解决方案: 

1 继承 view  

2 重写 dispatchTouchEvent

3 抓住异常

 
  1. public class FixedViewPager extends ViewPager {  
  2.         public FixedViewPager(Context context) {  
  3.                super(context);  
  4.        }  
  5.   
  6.         public FixedViewPager(Context context, AttributeSet attrs) {  
  7.                super(context, attrs);  
  8.        }  
  9.   
  10.         @Override  
  11.         public boolean dispatchTouchEvent(MotionEvent ev) {  
  12.                try {  
  13.                       return super .dispatchTouchEvent(ev);  
  14.               } catch (IllegalArgumentException ignored) {  
  15.               } catch (ArrayIndexOutOfBoundsException e) {  
  16.               }  
  17.   
  18.                return false ;  
  19.   
  20.        }  
  21. }  

网上有其它方法 如:

重写onInterceptTouchEvent 和onTouchEvent方法

try catch 该两个方法,形如下面:

 
  1. try{  
  2. super.onInterceptTouchEvent(MotionEvent ev)  
  3. catch(ILLegalArgumentException ex) {  
  4. }  
  5. return false;  
  6. try{  
  7. super.onTouchEvent(MotionEvent ev)  
  8. catch(ILLegalArgumentException ex) {  
  9. }  
  10. return false;  

参考: http://nanjingjiangbiao-t.iteye.com/blog/1794478

 

============= 1 

在做多点触控放大缩小,操作自己所绘制的图形时发生这个异常, 如果是操作图片的放大缩小多点触控不会出现这个错误

这个bug是Android系统原因   所以第一种方式是:

修改frameworks\base\core\jni\android_view_MotionEvent.cpp的 android_view_MotionEvent_nativeGetAxisValue方法

注释掉
 
  1. if (!validatePointerIndex(env, pointerIndex, pointerCount))   
  2. {return 0;}  
    改完后需重新编译整个系统,然后替换lib库,重新编译整个系统一般需要半个多小时,这个方法就比较麻烦了
 
第二种方法是:捕获IllegalArgumentException(非法参数异常)异常 即如
  1. private float spacing(MotionEvent event) {  
  2.         try {  
  3.         x = event.getX(0) - event.getX(1);  
  4.         y = event.getY(0) - event.getY(1);  
  5.     } catch (IllegalArgumentException e) {  
  6.         // TODO Auto-generated catch block  
  7.         e.printStackTrace();  
  8.     }  
    第二种方法简单有效
posted on 2016-04-07 15:04  左手指月  阅读(2756)  评论(0编辑  收藏  举报