警告を避けるために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
})
view.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
}
そして、そのようにして、単一のonTouchを呼び出して多くのボタンに実装し、onClickを使用することもできます。
view.performClick()
実装することを忘れないでください:
View.OnTouchListener
そしてリスナーを設定します:
next.setOnTouchListener(this)
previous.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
}
})
あなたの解決策が警告によって提示された問題を実際に解決するとは思わない。この警告は、特定のアクセシビリティ機能がperformClick()
を使用してボタンをアクティブにすることを示しています。 View
クラスを見ると、performClick()
関数はonClickListener
を直接呼び出します。つまり、onTouchListener
のコードは実行されません(next.setImageResource(R.drawable.layer_bt_next)
)これらのアクセシビリティ関数の場合、ビューに物理的に触れることはないため、onTouch
コードは実行されません。次のいずれかを実行する必要があります。
onTouchListener
を設定しているビューをサブクラス化し、performClick
をオーバーライドしてコードを実行するか、またはonClickListener
を設定します。OnTouchListenerクラスにonClickListener
を実装し、onTouchListener
からonClick()
を手動で呼び出すことができます(現在view.performClick()
がある場合)。 onClick
オーバーライドへの実行可能コード。また、ビューでonTouchListener
とonClickListener
の両方を設定する必要があります。
これがあなたが見たのと同じ問題かどうかはわかりませんが、このページで私の問題を検索しているのを見つけたので、他の人を助けるために自分の経験を追加したいと思いました:)
私の場合、null許容ビューはVoid
型である可能性があるため、警告が生成されていました。次の呼び出し:
nullableView?.setOnTouchListener(this)
エラーが発生しました:
Custom view Void has setOnTouchListener called on it but does not override performClick
View
がView
をオーバーライドするため、この場合、リスナーを設定する前にnullチェックを実行し、performClick
にキャストすることで解決しました。
if (nullableView != null) (nullableView as View).setOnTouchListener(this)