Перехватить сенсорное событие в RecyclerView, игнорируя EditText внутри - PullRequest
0 голосов
/ 19 января 2020

У меня есть recyclerView и элемент, как показано ниже:

list_row_item

Теперь я хочу иметь возможность щелкнуть в любом месте элемента, и должен появиться editText в фокусе. Я могу сделать это, установив onTouchListener в моем представлении следующим образом:

row_item.setOnTouchListener{ _, _ ->
            editText.requestFocus()
            view.background = Color.GREEN.toDrawable()
            true
        }

Я также хочу запускать некоторый дополнительный код при каждом нажатии элемента. Здесь я помещаю изменение цвета фона для примера.

Проблема в том, что всякий раз, когда я нажимаю на сам editText, он фокусируется, но row_item touchListener игнорируется, а фон не измените его цвет.

Из моего исследования я обнаружил, что должен каким-то образом перехватить событие касания. Я думал, что могу сделать это, возвращая true в row_item.setOnTouchListener, но это не работает, как вы можете видеть.

Как я могу перехватить такое событие касания?

1 Ответ

0 голосов
/ 19 января 2020

Вы должны создать собственный класс-контейнер, а затем переопределить метод onInterceptTouchEvent и делать там свои вещи, а затем использовать этот пользовательский класс-контейнер в качестве root элемента. Посмотрите на следующий код:

class CustomFrameLayout : FrameLayout {

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

    private var mOnInterceptTouchEventListener: OnTouchListener? = null

    fun setOnInterceptTouchEventListener(onInterceptTouchEventListener: OnTouchListener) {
        this.mOnInterceptTouchEventListener = onInterceptTouchEventListener
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        if(mOnInterceptTouchEventListener != null && mOnInterceptTouchEventListener?.onTouch(this, ev) == true)
            return true;
        return super.onInterceptTouchEvent(ev)
    }
}

И затем добавьте этот слушатель к вашему row_item

row_item.setOnInterceptTouchEventListener(object: View.OnTouchListener {
    override fun onTouch(v: View?, event: MotionEvent?): Boolean {
        editText.requestFocus()
        v?.background = Color.GREEN.toDrawable()
        return false
    }
})

, это может быть не лучший ответ, но он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...