Sous Android, la plupart des méthodes d'écoute d'événements renvoient une valeur booléenne. Que signifie cette valeur vraie / fausse? quel sera le résultat des événements de sous-séquence?
class MyTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
logView.showEvent(event);
return true;
}
}
En ce qui concerne l'exemple ci-dessus, si le retour est vrai dans la méthode onTouch , j'ai trouvé que chaque événement tactile (DOWN, UP, MOVE, etc.) a été capturé selon mon logView . Au contraire, si return false, seul l'événement DOWN a été capturé. Il semble donc que return false empêchera l'événement de se propager. Ai-je raison ?
De plus, dans un OnGestureListener , de nombreuses méthodes doivent également renvoyer une valeur booléenne. Ont-ils la même signification?
Depuis la documentation: http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View , android.view.MotionEvent)
"Vrai si l'auditeur a consommé l'événement, faux dans le cas contraire."
Si vous renvoyez true, l'événement est traité. Si faux, il passera à la couche suivante.
la source
La valeur booléenne détermine si l'événement est consommé ou non.
Oui, vous avez raison. Si vous retournez false, le prochain écouteur gère l'événement. S'il renvoie true, l'événement est consommé par votre auditeur et n'est pas envoyé à la méthode suivante.
la source
true
signifie que vous avez consommé l'événement et que vous voulez le reste des événements dans le geste - les autres écouteurs / vues ne recevront pas les événements.false
signifie laisser quelqu'un d'autre gérer l'événement. C'est en fait un peu plus précis que cela cependant; voir ma réponse.Toutes les réponses ci-dessus sont correctes mais le résultat est différent si la vue est
clickable
ou nonclickable
Exemple , j'ai un
LinearLayout
contient 1Button
et 1TextView
comme çaDans Activity, j'ai du code comme
Cas 1
Linear onTouch return **FALSE**
,Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Cliquez sur le bouton
Cliquez sur TextView
Cliquez sur LinearLayout
Cas 2
Linear onTouch return **FALSE**
,Button onTouch return **TRUE**
,TextView onTouch return **TRUE**
Cliquez sur le bouton
Cliquez sur TextView
Cliquez sur LinearLayout
Cas 3
Linear onTouch return **TRUE**
,Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Cliquez sur le bouton
Cliquez sur TextView
Cliquez sur LinearLayout
Remarque
TextView
estnot clickable
, il deviendra cliquable si nous définissonsandroid:clickable="true"
en xml OU lorsque nous définissonstextView.setOnClickListener(...)
event MOVE
pouvez appeler plus que mon journal (il repose sur la façon dont vous appuyez)Résumé
onTouch
retourtrue
ou vue estclickable
, View recevra toutonTouchEvent
onTouch
retourfalse
et vue n'est pasclickable
, vue sera ne recevra pas NEXT onTouchEvent (son parent peut le recevoir)J'espère que cela aidera
DEMO
la source
J'ai perdu près d'un jour en dépannage, mais j'ai encore découvert que ma fonction onTouch est appelée 2 fois en utilisant true et 1 fois en utilisant false.
la source
event.getAction()
car si vous revenezfalse
sur l'événement ACTION_DOWN, l'événement ACTION_UP est ignoré par l'auditeurDepuis le document Android :
Remarque: Android appellera d'abord les gestionnaires d'événements, puis les gestionnaires par défaut appropriés à partir de la définition de classe. En tant que tel, retourner true à partir de ces écouteurs d'événements arrêtera la propagation de l'événement vers d'autres écouteurs d'événements et bloquera également le rappel du gestionnaire d'événements par défaut dans la vue. Assurez-vous donc de vouloir mettre fin à l'événement lorsque vous renvoyez true.
la source