web-dev-qa-db-ja.com

Kotlin OnTouchListenerが呼び出されましたが、performClickをオーバーライドしません

警告を避けるためにKotlinperformClickをオーバーライドする方法は?

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

view.performClick 動作しません。

11
lambda

さて、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
}

そして、そのようにして、単一のonTouchを呼び出して多くのボタンに実装し、onClickを使用することもできます。

view.performClick()

実装することを忘れないでください:

View.OnTouchListener

そしてリスナーを設定します:

next.setOnTouchListener(this)
previous.setOnTouchListener(this)
4
lambda

この方法を試してください:

 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
        }
    })
16
Manohar Reddy

あなたの解決策が警告によって提示された問題を実際に解決するとは思わない。この警告は、特定のアクセシビリティ機能がperformClick()を使用してボタンをアクティブにすることを示しています。 Viewクラスを見ると、performClick()関数はonClickListenerを直接呼び出します。つまり、onTouchListenerのコードは実行されません(next.setImageResource(R.drawable.layer_bt_next))これらのアクセシビリティ関数の場合、ビューに物理的に触れることはないため、onTouchコードは実行されません。次のいずれかを実行する必要があります。

  1. onTouchListenerを設定しているビューをサブクラス化し、performClickをオーバーライドしてコードを実行するか、または
  2. コードを実行するビューにonClickListenerを設定します。

OnTouchListenerクラスにonClickListenerを実装し、onTouchListenerからonClick()を手動で呼び出すことができます(現在view.performClick()がある場合)。 onClickオーバーライドへの実行可能コード。また、ビューでonTouchListeneronClickListenerの両方を設定する必要があります。

4
mhswtf

これがあなたが見たのと同じ問題かどうかはわかりませんが、このページで私の問題を検索しているのを見つけたので、他の人を助けるために自分の経験を追加したいと思いました:)

私の場合、null許容ビューはVoid型である可能性があるため、警告が生成されていました。次の呼び出し:

nullableView?.setOnTouchListener(this)

エラーが発生しました:

Custom view Void has setOnTouchListener called on it but does not override performClick

ViewViewをオーバーライドするため、この場合、リスナーを設定する前にnullチェックを実行し、performClickにキャストすることで解決しました。

if (nullableView != null) (nullableView as View).setOnTouchListener(this)
1