Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin OnTouchListener已调用,但它不重写performClick_Android_Kotlin_Ontouchlistener - Fatal编程技术网

Android Kotlin OnTouchListener已调用,但它不重写performClick

Android Kotlin OnTouchListener已调用,但它不重写performClick,android,kotlin,ontouchlistener,Android,Kotlin,Ontouchlistener,如何在Kotlin中覆盖performClick,以避免警告 next.setOnTouchListener(View.OnTouchListener { view, motionEvent -> when (motionEvent.action){ MotionEvent.ACTION_DOWN -> { val icon: Drawable = ContextCompat.getDrawable(activi

如何在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
    })

查看。performClick
不起作用。

好的,我通过重写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
}
这样,我可以调用single onTouch并将其实现为多个按钮,还可以通过以下方式使用onClick:

view.performClick()
不要忘记实施:

View.OnTouchListener
并设置侦听器:

next.setOnTouchListener(this)
previous.setOnTouchListener(this)

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

  • 对要将
    onTouchListener
    设置为打开的视图进行子类化,并覆盖
    performClick
    以执行代码,或
  • 在执行代码的视图上设置一个
    onClickListener

  • 您只需在onTouchListener类中实现
    onClickListener
    ,并从
    onTouchListener
    手动调用
    onClick()
    (您现在有
    view.performClick()
    ),然后将可执行代码移动到
    onClick
    覆盖。您还必须在视图中同时设置
    onTouchListener
    onClickListener

    我不确定这是否与您看到的问题相同,但由于我发现此页面搜索我的问题,我想我应该添加我的经验来帮助其他人:)

    在我的例子中,生成警告是因为可为null的视图可能是
    Void
    类型。呼吁:

    nullableView?.setOnTouchListener(this)
    
    产生错误:

    自定义视图Void已调用setOnTouchListener,但未覆盖performClick

    在本例中,在设置侦听器之前执行空检查并强制转换到
    视图
    ,因为
    视图
    将覆盖
    性能单击

    if (nullableView != null) (nullableView as View).setOnTouchListener(this)
    
    试着这样做:

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

    你能用代码来举例吗?为了更好的理解。谢谢,对我来说没有任何意义。我有一些代码不能在onClick()上执行。这是一种长时间触摸的进度指示。可访问性并不重要。如果你不能触摸,你就不能使用它。也许我真的必须忽略这个警告。@TheincredibleJan-这个警告是为了可访问性的目的,所以如果这对您不重要或不相关,那么是的,您应该忽略它。将视图的子类转换为视图并不能真正解决问题,它只是愚弄了IDE。您需要重写
    performClick()
    在扩展targetView类型的自定义视图中。然后,在触摸屏下调用
    performClick()
    event@exploitr这就是我们不希望看到的,我们不希望使用Java和EditText创建customviewIn AS 4.0,即使在onTouch listener方法中添加了对performClick的调用,警告仍然存在,至少在我自己的代码中是这样。我必须明确地抑制警告。你覆盖了谁的侦听器?为什么会有什么不同呢?看起来像是侥幸…没什么区别。它应该有用。确保您有适当的父项,而该父项不会覆盖OnTouchListener这是如何获得如此多的向上投票的?这没什么区别,对我来说根本没什么区别。我想也许安卓工作室已经更新了,并且一直在展示lintingerror@LeonardoRick添加@SuppressLint(“ClickableViewAccessibility”)后,该错误作为辅助功能警告消失了。请参考此解决方案