2013-05-09 29 views
28

我在一個延伸FrameLayout我的自定義視圖有這樣的方法:java.lang.IllegalArgumentException異常:pointerIndex超出範圍例外的 - dispatchTouchEvent

@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); 
} 
在一段時間

一次 - 我得到以下異常:

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) 

我也使用onInterceptTouchEvent()嘗試,得到了相同的異常。

下面是一個附加堆棧跟蹤:

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) 
+1

工作對我來說,我有時也面臨着同樣的問題。嘗試發送'ev'副本而不是原始的'MotionEvent'。在方法的開頭添加一些類似於'MotionEvent evCopy = MotionEvent.obtain(ev)'的東西,並調用'super.dispatchTouchEvent(evCopy)'。 – 2013-05-09 10:45:21

+0

它是否完全爲您解決問題? – 2013-05-09 10:49:39

+0

我還沒試過。對我來說,當我擺脫ScrollView並因其他原因重新設計應用程序時,問題消失了。 – 2013-05-09 10:51:35

回答

33

有一個在2.1(埃克萊爾)中的錯誤,其中指針索引不檢查和有時是-1。您可以創建一個擴展ViewPager的自定義視圖,重寫onTouchEvent並將try/catch中的調用包裝爲super.onTouchEvent。雖然不是一個非常漂亮的解決方案,但我記得它沒有副作用(如錯過的觸摸事件)。

+0

我看到了這個錯誤,我已經用你之前所建議的解決辦法,但我試圖找到一種方法來妥善處理.. – 2013-05-13 10:49:32

+1

任何更新本或更好的解決辦法? – JPM 2013-10-11 21:12:40

+1

最近有一個支持庫的更新,它可能修復了這個錯誤(因爲它們修復了ViewPager,而不是2.1中導致的錯誤)。沒有檢查出來。 – FunkTheMonk 2013-10-14 14:11:44

7

添加到上面的回答,你也可以嘗試重寫onInterceptTouchEvent方法,並用try和catch圍繞super.onInterceptTouchEvent(EV)在ViewPager

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

我應該怎麼做,如果它得到了內部super.onInterceptTouchEvent崩潰( EV)? – 2016-04-23 04:06:06