ViewPager: java.lang.IllegalArgumentException: pointerIndex выходит за пределы диапазона

Я пишу код для обработки события касания на основе предложенного здесь. Я использую ViewPager как ViewGroup и ListView (я знаю #thisbad) как дочерний вид фрагмента.

Это то, чего я хотел достичь:

  • Обнаружение события мультитач в дочернем представлении
  • затем передайте управление касанием родительскому

но при передаче события прослушивателя из представления Child View в Parent это приводит к следующей ошибке:

E/AndroidRuntime(11414): java.lang.IllegalArgumentException:pointerIndex out of range      
E/AndroidRuntime(11414):    at android.view.MotionEvent.nativeGetAxisValue(Native Method)
E/AndroidRuntime(11414):    at android.view.MotionEvent.getX(MotionEvent.java:1979)
E/AndroidRuntime(11414):    at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
E/AndroidRuntime(11414):    at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:91)
E/AndroidRuntime(11414):    at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:219)
E/AndroidRuntime(11414):    at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1971) ..................
E/AndroidRuntime(11414):    at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5588)
E/AndroidRuntime(11414):    at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5634)
E/AndroidRuntime(11414):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
E/AndroidRuntime(11414):    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
E/AndroidRuntime(11414):    at android.view.Choreographer.doFrame(Choreographer.java:542)

Я проверил с некоторыми другими сообщениями те же проблемы как и здесь, но все они используют индексирование указателя, чтобы сделать что-то, но в моем случае я просто передаю управление родительскому (ViewPager) представлению.

Анализ: Здесь я проверил использование FrameLayout вместо Listview в Child Fragment. и он работает без какой-либо проблемы... но не с ListView.

Информация об устройстве: OS V4.4.4 S5.

Любое предложение!

Ответ 1

Я не знаю, почему MotionEventCompat вызывает MotionEventCompatEclair, как я видел в коде, есть перегрузка MotionEventCompatHoneycomb, но у меня была такая же проблема с Moto XT1040 в android 4.4.4.

Решение для меня создало мою версию ViewPager (я только что скопировал весь класс из источника android) и в методе onInterceptTouchEvent (MotionEvent ev) в случае MotionEvent.ACTION_MOVE изменил исходные строки:

final int activePointerId = mActivePointerId;
if (activePointerId == INVALID_POINTER) {
    // If we don't have a valid id, the touch down wasn't on content.
    break;
}

final int pointerIndex = MotionEventCompat.findPointerIndex(ev, activePointerId);
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float dx = x - mLastMotionX;
final float xDiff = Math.abs(dx);
final float y = MotionEventCompat.getY(ev, pointerIndex);
final float yDiff = Math.abs(y - mInitialMotionY);

в

final int activePointerId = mActivePointerId;
if (activePointerId == INVALID_POINTER) {
    // If we don't have a valid id, the touch down wasn't on content.
    break;
}

final int pointerIndex = MotionEventCompat.findPointerIndex(ev, activePointerId);
final float x = ev.getX(pointerIndex);
final float dx = x - mLastMotionX;
final float xDiff = Math.abs(dx);
final float y = ev.getY(pointerIndex);
final float yDiff = Math.abs(y - mInitialMotionY);

Единственное изменение было в переменных x и y, я был изменен, чтобы напрямую вызвать метод MotionEvent getX и getY, игнорируя MotionEventCompat.

Мое приложение было минимальным api 14, если вы поддерживаете что-то предыдущее с 14, я предлагаю вам позвонить ближайшему MotionEventCompat из вашей версии. Вам просто нужно запретить вызывать версию MotivoEventCompatEclair.