Lorsque j'essaie d'ajouter onTouchListner()
à un bouton, cela me donne le
Button a appelé setOnTouchListener mais ne remplace pas performClick
avertissement. Quelqu'un sait-il comment y remédier?
btnleftclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
Erreur:
La vue personnalisée a appelé setOnTouchListener mais ne remplace pas performClick Si une vue qui remplace onTouchEvent ou utilise un OnTouchListener n'implémente pas également performClick et l'appelle lorsque des clics sont détectés, la vue peut ne pas gérer correctement les actions d'accessibilité. La logique de gestion des actions de clic doit idéalement être placée dans View # performClick car certains services d'accessibilité invoquent performClick lorsqu'une action de clic doit se produire.
ImageView
a appelé setOnTouchListener mais ne remplace pas performClick Si une vue qui remplace onTouchEvent ou utilise un OnTouchListener n'implémente pas également performClick et l'appelle lorsque des clics sont détectés, la vue peut ne pas gérer correctement les actions d'accessibilité. La logique de gestion des actions de clic doit idéalement être placée dans View # performClick car certains services d'accessibilité invoquent performClick lorsqu'une action de clic doit se produire.Réponses:
Cet avertissement apparaît parce qu'Android veut vous rappeler de penser aux personnes aveugles ou malvoyantes qui peuvent utiliser votre application. Je vous suggère de regarder cette vidéo pour un aperçu rapide de ce à quoi cela ressemble.
Les vues de l' interface utilisateur standard (comme
Button
,TextView
, etc.) sont tous mis en place pour fournir aux utilisateurs des aveugles avec des commentaires appropriés grâce à des services d' accessibilité. Lorsque vous essayez de gérer vous-même les événements tactiles, vous risquez d'oublier de fournir ce retour d'information. C'est à cela que sert l'avertissement.Option 1: créer une vue personnalisée
La gestion des événements tactiles est normalement effectuée dans une vue personnalisée. Ne rejetez pas cette option trop rapidement. Ce n'est pas vraiment si difficile. Voici un exemple complet de
TextView
qui est remplacé pour gérer les événements tactiles:Ensuite, vous l'utiliseriez simplement comme ceci:
Voir mon autre réponse pour plus de détails sur la création d'une vue personnalisée.
Option 2: désactiver l'avertissement
D'autres fois, il vaudrait peut-être mieux faire taire l'avertissement. Par exemple, je ne suis pas sûr de ce que vous voulez faire avec un pour
Button
lequel vous avez besoin d'événements tactiles. Si vous deviez faire un bouton personnalisé et appeléperformClick()
àonTouchEvent
comme je l' ai fait ci - dessus pour la coutumeTextView
, alors il s'appelle chaque fois que deux fois parce que lesButton
appels déjàperformClick()
.Voici quelques raisons pour lesquelles vous voudrez peut-être simplement faire taire l'avertissement:
Ajoutez la ligne suivante au début de la méthode pour supprimer l'avertissement:
Par exemple:
la source
MotionEvent event
objet dans votredoSomething()
méthode? J'ai besoin de vérifierevent.getY()
.performClick()
. Ma première pensée est que si leevent.getY()
n'est pas intégral à l'événement de clic réel (c'est-à-dire les effets visuels de l'interface utilisateur), remettez cette logique àonTouchEvent()
. Sinon, vous pouvez créer une variable de membre de classe pour stocker la dernièreY
valeur d' action up . Je vous suggère également de consulter le code source de quelques-unes des vues standard afin de voir comment Android l'implémente. J'ai besoin de les étudier davantage moi-même.onTouchEvent()
mais pasperformClick()
. Cela peut inclure un balayage ou un clic ou tout autre événement tactile que vous essayez de capturer.Solution:
Créez une classe qui étend Button ou la vue que vous utilisez et remplacez performClick ()
Maintenant, utilisez ce TouchableButton en xml et / ou en code et l'avertissement sera parti!
la source
android.widget.Button
est codé en dur, il ne vous permet donc pas de le faire. Et cela semble être très intentionnel de la part de l'équipe de développement Android.Avez-vous essayé d'ajouter:
ou en ajoutant une annotation suppresslint:
?
la source
https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events
la source