2013-05-09 30 views
28

tôi có phương pháp này theo quan điểm tùy chỉnh của tôi kéo dài FrameLayout:java.lang.IllegalArgumentException: pointerIndex ra khỏi phạm vi ngoại lệ - 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); 
} 

Một lần trong một thời gian - Tôi nhận được ngoại lệ sau:

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) 

Tôi cũng đã thử sử dụng onInterceptTouchEvent() và có ngoại lệ tương tự.

Dưới đây là một stacktrace thêm:

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

Tôi cũng đang phải đối mặt với vấn đề tương tự đôi khi. Cố gắng gửi bản sao của 'ev' thay vì bản gốc' MotionEvent'. Trong phương thức rất bắt đầu của phương thức, hãy thêm một cái gì đó như 'MotionEvent evCopy = MotionEvent.obtain (ev)' và gọi 'super.dispatchTouchEvent (evCopy)' thay thế. –

+0

Đã giải quyết xong sự cố cho bạn chưa? –

+0

Tôi chưa thử. Đối với tôi, vấn đề biến mất khi tôi loại bỏ 'ScrollView' và thiết kế lại ứng dụng vì một lý do khác. –

Trả lời

33

Có một lỗi trong 2.1 (Eclair), nơi chỉ số con trỏ không được chọn và đôi khi -1. Bạn có thể tạo một khung nhìn tùy chỉnh mở rộng ViewPager, ghi đè lên onTouchEvent và kết thúc cuộc gọi đến super.onTouchEvent trong một try/catch. Trong khi không phải là một sửa chữa rất đẹp, tôi nhớ rằng nó không có tác dụng phụ (như các sự kiện cảm ứng bị mất).

+0

Tôi đã thấy lỗi này và tôi đã sử dụng giải pháp thay thế mà bạn đã đề xuất trước đó, nhưng tôi đang cố tìm cách xử lý đúng cách. –

+1

Bất kỳ cập nhật nào cho giải pháp này hay giải pháp tốt hơn? – JPM

+1

Có một bản cập nhật cho thư viện hỗ trợ gần đây có thể đã sửa lỗi này (như trong, chúng đã sửa ViewPager, chứ không phải lỗi gây ra trong 2.1). Chưa kiểm tra. – FunkTheMonk

7

Thêm vào câu trả lời ở trên Ngoài ra bạn có thể thử phương pháp Overriding onInterceptTouchEvent và bao quanh super.onInterceptTouchEvent (ev) với thử và nắm bắt từng làm việc cho tôi trong một ViewPager

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

Tôi nên làm gì nếu nó gặp sự cố bên trong super.onInterceptTouchEvent (ev)? –

Các vấn đề liên quan