Код: Выделить всё
val gestureDetector = GestureDetector(this.fragment.activity, ScrollGestureListener(scrollView))
scrollView.setOnTouchListener(OnTouchListener { view, event ->
gestureDetector.onTouchEvent(event)
return@OnTouchListener false
})
internal inner class ScrollGestureListener(view: View) : GestureDetector.SimpleOnGestureListener() {
override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
this@DocumentViewer.onDrag()
return true
}
}
Код: Выделить всё
override fun onScroll(e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
Комментарий к этому сообщению SO гласит: «Вы получите сбой, подобный сбою это если событие ACTION_DOWN потребляет что-то иное, чем детектор жестов». Но я не могу понять, что еще будет делать это. У меня есть детекторы жестов в некоторых других представлениях в этом фрагменте, но если я закомментирую весь этот код, сбои останутся.
Я временно добавил реализацию onDown в свой ScrollGestureListener и он никогда не вызывался, так что это, похоже, связано с комментарием ACTION_DOWN.
Глядя на исходный код GestureDetector.java, я вижу, что первый аргумент он отправляет в onScroll mCurrentDownEvent, так что это также связано с комментарием ACTION_DOWN. Но если я добавлю точки останова в GestureDetector.java в Android Studio, mCurrentDownEvent никогда не будет отображаться как ноль. Кроме того, оно всегда совпадает с событием, переданным в качестве второго аргумента (
Код: Выделить всё
evПохоже, что сбой происходит, когда GestureDetector) code> вызывает onScroll, потому что точка останова в моем методе onScroll не достигнута, и тот же сбой произойдет, если я удалю переопределение onScroll - очевидно, просто вызываю реализацию суперкласса onScroll вызывает сбой. Вот что появляется в консоли:
Код: Выделить всё
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.arlomedia.bandhelper, PID: 18797
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter e1
at com.arlomedia.bandhelper.helpers.DocumentViewer$ScrollGestureListener.onScroll(Unknown Source:2)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:788)
at com.arlomedia.bandhelper.helpers.DocumentViewer.viewDocument$lambda-9(DocumentViewer.kt:1398)
at com.arlomedia.bandhelper.helpers.DocumentViewer.$r8$lambda$kyj-4h2jNAIkIYOWSE7_HVetJAg(Unknown Source:0)
at com.arlomedia.bandhelper.helpers.DocumentViewer$$ExternalSyntheticLambda7.onTouch(Unknown Source:6)
at android.view.View.dispatchTouchEvent(View.java:15147)
Код: Выделить всё
if (event != null) {
gestureDetector.onTouchEvent(event)
}
Еще одна потенциальная подсказка: onScroll вызывается только в том случае, если мой палец все еще находится на экране при вызове onTouchEvent. Обычно это так, но я попробовал отложить вызов следующим образом:
Код: Выделить всё
val runnable = Runnable {
gestureDetector.onTouchEvent(event)
}
App.instance.timerHandler.postDelayed(runnable, 1000)
Я могу представить два подхода к исправлению этой проблемы. : проверка события в моем OnTouchListener перед вызовом onTouchEvent или выяснение того, что заставляет GestureDetector отправлять недопустимые события в onScroll. Но у меня закончились идеи по обоим вариантам. Есть у кого-нибудь еще идеи?
Подробнее здесь: https://stackoverflow.com/questions/739 ... nd-crashes
Мобильная версия