web-dev-qa-db-fra.com

Kotlin OnTouchListener appelé mais il ne remplace pas performClick

Comment annuler performClick dans Kotlin pour éviter les avertissements.

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 ne fonctionne pas.

6
lambda

D'accord, j'ai résolu mon propre problème en ignorant le programme d'écoute 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
}

Et de cette façon, je peux appeler single onTouch et l'implémenter sur de nombreux boutons et également utiliser onClick en:

view.performClick()

N'oubliez pas de mettre en œuvre:

View.OnTouchListener

Et définissez l'auditeur: 

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

Essayez de cette façon:

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

Je ne pense pas que votre solution résoudra réellement le problème présenté par l'avertissement. L'avertissement indique que certaines fonctions d'accessibilité utilisent performClick() pour activer les boutons. Si vous regardez dans la classe View, les fonctions performClick() appellent directement onClickListener, ce qui signifie que le code de la onTouchListener ne sera pas exécuté (next.setImageResource(R.drawable.layer_bt_next)) pour ces fonctions d’accessibilité, car la vue ne sera jamais physiquement touchée et votre code onTouch sera donc gagné ' t courir. Vous devez faire l’un des choix suivants:

  1. Sous-classe la vue sur laquelle vous définissez la onTouchListener et remplacez performClick pour exécuter le code, ou
  2. Définissez onClickListener sur la vue qui exécute le code.

Vous pouvez simplement implémenter onClickListener dans votre classe onTouchListener et appeler manuellement onClick() à partir de votre onTouchListener (où vous avez maintenant view.performClick()), puis déplacez votre code exécutable sur le remplacement onClick. Vous devez également définir BOTH onTouchListener and onClickListener sur vos vues.

4
mhswtf

Je ne suis pas sûr que ce soit le même problème que vous avez vu, mais depuis que j'ai trouvé cette page à la recherche de mon problème, j'ai pensé ajouter mon expérience pour aider les autres :)

Dans mon cas, l'avertissement était généré car la vue nullable pouvait être de type Void. Appelant le suivant:

nullableView?.setOnTouchListener(this)

a produit l'erreur:

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

Effectuer une vérification nulle et transtyper une View avant de régler l'auditeur résolu pour moi dans ce cas, puisque View remplacera performClick:

if (nullableView != null) (nullableView as View).setOnTouchListener(this)
1
head in the codes