Kotlin OnTouchListener被调用,但它不会覆盖performClick

lam*_*bda 11 android ontouchlistener kotlin

如何覆盖Kotlin中的performClick以避免警告.

next.setOnTouchListener(View.OnTouchListener { view, motionEvent ->
        when (motionEvent.action){
            MotionEvent.ACTION_DOWN -> {
                val icon: Drawable = ContextCompat.getDrawable(activity.applicationContext, R.drawable.layer_bt_next)
                icon.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
                next.setImageDrawable(icon)
            }
            MotionEvent.ACTION_UP -> {
                //view.performClick()
                next.setImageResource(R.drawable.layer_bt_next)
            }
        }
        return@OnTouchListener true
    })
Run Code Online (Sandbox Code Playgroud)

view.performClick不起作用.

Man*_*ddy 18

试试这种方式:

 next.setOnTouchListener(object : View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent?): Boolean {
            when (event?.action) {
                MotionEvent.ACTION_DOWN -> //Do Something
            }

            return v?.onTouchEvent(event) ?: true
        }
    })
Run Code Online (Sandbox Code Playgroud)

  • 没有什么区别。 (3认同)
  • 这怎么能得到这么多人的点赞呢?这没有什么区别。 (2认同)
  • @LeonardoRick 添加 @SuppressLint("ClickableViewAccessibility") 后,错误作为可访问性警告消失了。参考此解决方案/sf/answers/3524158291/ (2认同)

lam*_*bda 9

好的,我通过覆盖 OnTouch 侦听器解决了我自己的问题。

override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
    when (view) {
        next -> {
            Log.d("next", "yeyy")
            when (motionEvent.action){
                MotionEvent.ACTION_DOWN -> {
                    val icon: Drawable = ContextCompat.getDrawable(activity.applicationContext, R.drawable.layer_bt_next)
                    icon.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
                    next.setImageDrawable(icon)
                }
                MotionEvent.ACTION_UP -> {
                    view.performClick()
                    next.setImageResource(R.drawable.layer_bt_next)
                }
            }
        }
        previous -> {
            //ingredients here XD
        }
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

这样,我可以调用单个 onTouch 并将其实现到多个按钮,也可以通过以下方式使用 onClick:

view.performClick()
Run Code Online (Sandbox Code Playgroud)

不要忘记实施:

View.OnTouchListener
Run Code Online (Sandbox Code Playgroud)

并设置监听器:

next.setOnTouchListener(this)
previous.setOnTouchListener(this)
Run Code Online (Sandbox Code Playgroud)


mhs*_*wtf 7

我认为您的解决方案实际上不会解决警告提出的问题。警告指出某些辅助功能用于performClick()激活按钮。如果您查看View类,函数会直接performClick()调用onClickListener,这意味着onTouchListener不会next.setImageResource(R.drawable.layer_bt_next)为这些可访问性函数执行 ( ) 中的代码,因为视图永远不会被物理接触,因此您的onTouch代码将不会运行。您必须执行以下任一操作:

  1. 子类化您正在设置的视图onTouchListener,并覆盖performClick以执行代码,或
  2. onClickListener在执行代码的视图上设置。

您可以onClickListener在您的 onTouchListener 类中实现并onClick()从您的onTouchListener(您view.performClick()现在拥有的位置)手动调用,然后将您的可执行代码移动到onClick覆盖。您还必须在您的观点上设置 BOTHonTouchListeneronClickListener