忽略RecyclerView中的触摸事件,而忽略其中的EditText

时间:2020-01-19 10:54:34

标签: android kotlin

我有带有和项目的recyclerView,如下所示:

list_row_item

现在,我希望能够单击该项目的任何位置,并且editText应该成为焦点。 我可以这样设置onTouchListener

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

每当单击该项目时,我还希望运行一些其他代码。为了示例,我在这里放置背景颜色更改。

问题在于,每当我单击editText本身时,它就会变得聚焦,但是row_item touchListener会被忽略,并且背景不会更改其颜色。

从我的研究中,我发现我应该以某种方式拦截触摸事件。我以为可以通过在row_item.setOnTouchListener中返回true来做到这一点,但是您无法看到它。

如何拦截此类触摸事件?

1 个答案:

答案 0 :(得分:0)

您应该创建一个自定义容器类,然后重写onInterceptTouchEvent方法并在那里进行操作,然后使用此自定义容器类作为项目的根。看下面的代码:

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
    }
})

这可能不是最好的答案,但它可行。