SimpleOnGestureListener.onScroll получает нулевое значение и происходит сбойAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 SimpleOnGestureListener.onScroll получает нулевое значение и происходит сбой

Сообщение Anonymous »

Я использую детектор жестов для захвата событий прокрутки из режима прокрутки:

Код: Выделить всё

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
}
}
При использовании compileSdkVersion 30 мое приложение аварийно завершало работу при вызове функции onScroll, поскольку она всегда получала нулевое значение для первого аргумента. Я решил эту проблему, сделав первый аргумент необязательным:

Код: Выделить всё

override fun onScroll(e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
Теперь я пытаюсь обновить свою версию compileSdkVersion до 33, но приведенная выше строка больше не компилируется. Но если я вернусь к стандартной сигнатуре функции, приложение снова выйдет из строя, когда я прокрутлю представление прокрутки.
Комментарий к этому сообщению SO гласит: «Вы получите сбой, подобный сбою это если событие ACTION_DOWN потребляет что-то иное, чем детектор жестов». Но я не могу понять, что еще будет делать это. У меня есть детекторы жестов в некоторых других представлениях в этом фрагменте, но если я закомментирую весь этот код, сбои останутся.
Я временно добавил реализацию onDown в свой ScrollGestureListener и он никогда не вызывался, так что это, похоже, связано с комментарием ACTION_DOWN.
Глядя на исходный код GestureDetector.java, я вижу, что первый аргумент он отправляет в onScroll mCurrentDownEvent, так что это также связано с комментарием ACTION_DOWN. Но если я добавлю точки останова в GestureDetector.java в Android Studio, mCurrentDownEvent никогда не будет отображаться как ноль. Кроме того, оно всегда совпадает с событием, переданным в качестве второго аргумента () -- GestureDetector просто устанавливает 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)
Я пробовал добавить какую-то проверку в свой OnTouchListener перед вызовом onTouchEvent – примерно так:

Код: Выделить всё

if (event != null) {
gestureDetector.onTouchEvent(event)
}
Но событие здесь никогда не имеет нулевого значения, и, просматривая его свойства, я не вижу ничего, что можно было бы проверить, чтобы определить, приведет ли это к сбою.
Еще одна потенциальная подсказка: onScroll вызывается только в том случае, если мой палец все еще находится на экране при вызове onTouchEvent. Обычно это так, но я попробовал отложить вызов следующим образом:

Код: Выделить всё

val runnable = Runnable {
gestureDetector.onTouchEvent(event)
}
App.instance.timerHandler.postDelayed(runnable, 1000)
Тогда, если я выполняю прокрутку и убираю палец с экрана в течение одной секунды, onScroll не вызывается и сбоя не происходит. Если я выполняю прокрутку и оставляю палец на экране более чем на одну секунду, вызывается onScroll и происходит сбой.
Я могу представить два подхода к исправлению этой проблемы. : проверка события в моем OnTouchListener перед вызовом onTouchEvent или выяснение того, что заставляет GestureDetector отправлять недопустимые события в onScroll. Но у меня закончились идеи по обоим вариантам. Есть у кого-нибудь еще идеи?

Подробнее здесь: https://stackoverflow.com/questions/739 ... nd-crashes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»