我有带有和项目的recyclerView,如下所示:
现在,我希望能够单击该项目的任何位置,并且editText应该成为焦点。
我可以这样设置onTouchListener
:
row_item.setOnTouchListener{ _, _ ->
editText.requestFocus()
view.background = Color.GREEN.toDrawable()
true
}
每当单击该项目时,我还希望运行一些其他代码。为了示例,我在这里放置背景颜色更改。
问题在于,每当我单击editText本身时,它就会变得聚焦,但是row_item touchListener会被忽略,并且背景不会更改其颜色。
从我的研究中,我发现我应该以某种方式拦截触摸事件。我以为可以通过在row_item.setOnTouchListener中返回true来做到这一点,但是您无法看到它。
如何拦截此类触摸事件?
答案 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
}
})
这可能不是最好的答案,但它可行。