Братский вид предотвращает прокрутку в окне повторного просмотра - PullRequest
0 голосов
/ 05 ноября 2019

Мой экран состоит из ConstraintLayout с двумя дочерними элементами. Один ребенок - это RecyclerView, который занимает весь экран. Другой дочерний элемент - это другой ConstraintLayout, который содержит TextView (экран на самом деле более сложный, чем этот, но я сокращаю его до чего-то здесь, чтобы его было легче понять). Дочерний ConstraintLayout располагается над RecyclerView и прокручивается вверх всякий раз, когда вы прокручиваете RecyclerView. Это делается с помощью прослушивателя прокрутки в RecyclerView и повторной настройки позиции Y дочернего ConstraintLayout. Дочерний ConstraintLayout должен быть активным.

Проблема, с которой я столкнулся, заключается в том, что если вы попытаетесь прокрутить RecyclerView, сначала коснувшись дочернего ConstraintLayout, прокрутка не будет работать. Однако обработчик события click для дочернего ConstraintLayout будет работать.

Из моего понимания того, как Android обрабатывает события касания, если представление возвращает ложное в своем обработчике onTouchEvent, это представление не получит уведомление о каких-либо дальнейших событиях движения,Поэтому теоретически, если мой дочерний объект ConstraintLayout возвращает false в своем обработчике onTouchEvent, RecyclerView все равно должен получать события движения прокрутки.

Вот мой макет xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:background="#55338855">

    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/dashboardConstraintLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:layoutDescription="@xml/dashboard_initial_animation_start"
        app:showPaths="false">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/contentRecyclerView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:clipChildren="false"
            android:fitsSystemWindows="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toEndOf="@id/guideWelcome"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintWidth_default="percent"
            app:layout_constraintWidth_percent="1.0" />

        <ReservationCard
            android:id="@+id/reservationConstraintLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="60dp"
            android:layout_marginEnd="16dp"
            android:layout_marginBottom="16dp"
            android:background="@color/dashboard_reservation_card_background_color"
            android:padding="16dp"
            android:visibility="invisible"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/txtSearch">

            <TextView
                android:id="@+id/txtReservationHeader"
                style="@style/AppTheme.Label"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="@string/dashboard_screen_reservation_card_headline"
                android:textColor="@color/dashboard_reservation_card_text_color" />

        </com.sinnerschrader.motelone.screens.dashboard.ReservationCard>

    </androidx.constraintlayout.motion.widget.MotionLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

А вот мой пользовательский ConstraintLayout (ReservationCard):

class ReservationCard : androidx.constraintlayout.widget.ConstraintLayout {

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    private val gestureDetector: GestureDetector

    init {
        gestureDetector = GestureDetector(GestureListener())
    }

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        if (ev?.action == MotionEvent.ACTION_DOWN) {
            gestureDetector.onTouchEvent(ev)
            return true
        } else if (ev?.action == MotionEvent.ACTION_UP) {
            gestureDetector.onTouchEvent(ev)
            return false
        } else {
            super.onTouchEvent(ev)
            return false
        }
    }

    private inner class GestureListener : GestureDetector.OnGestureListener {
        override fun onFling(p0: MotionEvent?, p1: MotionEvent?, p2: Float, p3: Float): Boolean {
            return false
        }

        override fun onScroll(p0: MotionEvent?, p1: MotionEvent?, p2: Float, p3: Float): Boolean {
            return false
        }

        override fun onLongPress(p0: MotionEvent?) {
        }

        override fun onDown(p0: MotionEvent?): Boolean {
            return false
        }

        override fun onShowPress(p0: MotionEvent?) {
        }

        override fun onSingleTapUp(p0: MotionEvent?): Boolean {
            return false
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...