Android Kotlin child onClick блокирует родительский OnTouch

У меня есть эта иерархия раскладки:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/parent" android:layout_width="match_parent" android:layout_height="match_parent"> <com.xxxxxx.Widget android:id="@+id/widget1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <com.xxxxxx.Widget android:id="@+id/widget2" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout> 

У меня есть контакты для родительского LinearLayout следующим образом:

 parent.setOnTouchListener(myCustomTouchParent) class MyCustomTouchParent(ctx: Context): View.OnTouchListener { private var isScrollingDown = false private var isScrollingUp = false private val myGestureDetected = GestureDetector(ctx, MyGestureListener()) var onRecyclerViewMovingDown: (() -> Unit)? = null override fun onTouch(p0: View?, e: MotionEvent): Boolean { myGestureDetected.onTouchEvent(e) when(e.action){ MotionEvent.ACTION_UP -> { if (isScrollingDown) { onRecyclerViewMovingDown?.invoke() } } MotionEvent.ACTION_DOWN -> { Log.i("TAg", "Action Down") isScrollingDown = false isScrollingUp = false } } return true } inner class MyGestureListener: GestureDetector.SimpleOnGestureListener() { override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean { if(e2.y - e1.y > 0){ isScrollingUp = true } else if(e2.y - e1.y < 0){ isScrollingDown = true } return super.onScroll(e1, e2, distanceX, distanceY) } } } 

В принципе, это обнаружит событие «Scroll Up» на родительском объекте и будет выполнять некоторые анимации. Проблема в том, что, как только я установил прослушиватель кликов для widget1 и widget2, событие касания родителя больше не работает. Есть ли обходной путь для этого?

    Единственное, что сработало для меня: в родительском LinearLayout, перехватите прикосновение, вызовите onTouchEvent и верните false:

     override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { onTouchEvent(ev) return false } 

    Переместите TouchInterceptor с помощью класса Gesture Detector в родительский onTouchEvent:

     override fun onTouchEvent(e: MotionEvent): Boolean { myGestureDetected.onTouchEvent(e) when(e.action){ MotionEvent.ACTION_UP -> { if (isScrollingDown) { onRecyclerViewMovingDown?.invoke() } } MotionEvent.ACTION_DOWN -> { isScrollingDown = false isScrollingUp = false } } return super.onTouchEvent(e) } 

    Я не знаю, есть ли лучшее решение, но это позволило мне сначала обработать событие касания родителя, затем оно передало прикосновение к дочерним элементам. Там вы можете настроить прослушиватели кликов.

    Кроме того, если вы не устанавливаете прослушиватели кликов, область касания, содержащая элемент, который можно щелкнуть, не вызывает касания. поэтому, лучше установить

     clickable=true 

    во всех элементах, а затем только устанавливать слушателей, когда вам нужно.

    Вы должны переопределить как onTouchListeners на представлениях ваших детей, так и вернуть false, что сделает их не переопределением родительского ontouch.

     widget1.onTouch { view, motionEvent -> return@onTouch false } widget2.onTouch { view, motionEvent -> return@onTouch false } 
    Intereting Posts
    Kotlin ": некоторые файлы JAR в пути к классам имеют библиотеку Runtime Kotlin, вложенную в них" Как открыть ссылки, не связанные с URL веб-браузера в браузере из приложения Логика загрузки Endless RecyclerView несовместима на всех устройствах Как определить свойство типа класса с помощью get () в Котлине Ошибка внутреннего компилятора Android Studio kaptDebugKoltin Glide не может загружать URL-адрес сервера Есть ли способ отфильтровать null Any? ценностей на карте Котлина? почему kotlin lambda декомпилируется в java-код (Function0) null.INSTANCE Сгенерированные классы не найдены Okhttp3-запрос, возвращающий пустой ответ, а также разные заголовки, чем Postman Локальные функции доступа к родительским переменным с тем же именем Как сделать вывод типа Котлин из отражения KClass? Используйте подпроекты Gradle с мультиплатформой Kotlin Не удается найти вид в нижнем листе с эспрессо Ошибка при использовании объекта для реализации пустого списка