2013-05-09 5 views
28

mam tę metodę w moim niestandardowego widoku, który rozciąga FrameLayout:java.lang.IllegalArgumentException: pointerIndex poza zakresem Wyjątek - 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); 
} 

raz na jakiś czas - Dostaję następujący wyjątek:

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) 

Próbowałem również przy użyciu onInterceptTouchEvent() i otrzymałem ten sam wyjątek.

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

Ja też napotykają na takie same problemy z czasem. Spróbuj wysłać kopię 'ev' zamiast oryginalnego' MotionEvent'. Na samym początku metody dodaj coś w stylu 'MotionEvent evCopy = MotionEvent.obtain (ev)' i wywołaj 'super.dispatchTouchEvent (evCopy)'. –

+0

Czy to rozwiązanie całkowicie rozwiązało problem? –

+0

Nie próbowałem jeszcze. Dla mnie problem zniknął, gdy pozbyłem się "ScrollView" i przeprojektowałem aplikację z innych powodów. –

Odpowiedz

33

Jest to błąd w 2.1 (Eclair), gdzie indeks wskaźnik nie jest sprawdzana i jest czasami -1. Możesz utworzyć niestandardowy widok, który rozszerza ViewPager, zastępuje TouchEvent i opakowuje wywołanie super.onTouchEvent w try/catch. Chociaż nie jest to bardzo ładna poprawka, pamiętam, że nie ma żadnych skutków ubocznych (takich jak nieodebrane zdarzenia dotykowe).

+0

Widziałem tego błędu i użyłem obejścia, które zasugerowałeś wcześniej, ale próbuję znaleźć sposób, aby właściwie go obsłużyć. –

+1

Jakieś uaktualnienie tego lub lepszego rozwiązania? – JPM

+1

Niedawno pojawiła się aktualizacja biblioteki pomocy technicznej, która mogła naprawić ten błąd (tak jak w przypadku, naprawiono ViewPager, a nie powodował błąd w wersji 2.1). Nie sprawdziłem tego. – FunkTheMonk

7

Dodając do powyższego odpowiedź Ponadto można spróbować metody Zastępowanie onInterceptTouchEvent i otoczyć super.onInterceptTouchEvent (EV) z spróbować połowu pracował dla mnie w ViewPager

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

Co powinienem zrobić, jeśli się zawiesił wewnątrz super.onInterceptTouchEvent (ev)? –