OnTouchEvent ne fonctionne pas sur les vues enfant
J'ai un Linéaire de la Présentation d'un Bouton et d'un TextView sur elle. J'ai écrit un OnTouchEvent de l'activité. Le code fonctionne très bien si je touche sur l'écran, mais si je touche le bouton, le code ne fonctionne pas. Quelle est la solution pour cela?
public boolean onTouchEvent(MotionEvent event) {
int eventaction=event.getAction();
switch(eventaction)
{
case MotionEvent.ACTION_MOVE:
reg.setText("hey");
break;
}
return true;
}
- Veuillez coller le code de votre activité.
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est l'ordre des opérations pour comment Android gère les événements tactiles. Chaque événement de touche suit le modèle de (exemple simplifié):
Mais uniquement sur les événements de suivre la chaîne jusqu'à ce qu'ils sont consommés (ce qui signifie que quelqu'un retourne true de
onTouchEvent()
ou de l'auditeur). Dans le cas où vous venez de contact quelque part sur l'écran, personne ne s'intéresse à l'événement, afin qu'il s'écoule vers le bas de votre code. Toutefois, dans le cas d'un bouton (ou d'autres cliquableView
), il consomme de l'événement de touche parce qu'il est intéressé par elle, de sorte que le flux s'arrête à la Ligne 4.Si vous souhaitez surveiller toutes les touches qui vont dans votre Activité, vous avez besoin de remplacer
dispatchTouchEvent()
depuis toujours est appelé en premier,onTouchEvent()
pour une Activité est appelée à durer, et que si personne d'autre ne capturé l'événement. Attention à ne pas consommer d'événements ici, bien que, ou l'enfant du point de vue pourra jamais obtenir et vos boutons ne sera pas cliquable.Une autre option serait de mettre votre touche de manipulation de code dans un personnalisé
ViewGroup
(commeLinearLayout
) et l'utilisation de sononInterceptTouchEvent()
méthode pour permettre à la mère pour voler loin et gérer les événements tactiles lorsque cela est nécessaire. Soyez prudent, cependant, que cette interaction est un qui ne peut pas être annulée jusqu'à ce qu'un nouvel événement tactile commence (une fois que vous en voler un événement, vous voler toutes).HTH
onTouchEvent()
code, ce qui remplace. Cela sonne comme une question distincte, qui nécessite un examen plus approfondi du code. Mais on dirait également que vous pourriez avoir besoin pour lire un peu plus sur la façon de faire toucher personnalisé de la manipulation, car il peut être très difficile si vous n'avez pas attraper tous les cas. Voici une présentation que j'ai fait récemment qui pourrait vous aider à mieux comprendre ce processus: andevcon.com/AndevCon_III/...onTouchEvent
ou de pause de l'exécution aprèsAction_Down
s'est produite. J'ai juste mis en œuvre une partie de votre réponse, la vérification pour une action et la rupture de l'exécution de manière appropriée. Vous êtes un absolu bouée de sauvetage, merci beaucoup!!!Permettez-moi d'ajouter un commentaire à cet excellent post de @Devunwired.
Si vous avez également définir une onTouchListener sur votre point de Vue, son onTouch() méthode sera appelée APRÈS l'envoi des méthodes, mais AVANT tout onTouchEvent() la méthode, c'est à dire entre pas.3 et no.4 sur @Devunwired de réponse.
Essayez de définir la descendantFocusability attribut de votre mise en page pour blocksDescendants
Activity::onTouchEvent
sera appelée que lorsque non de la vue dans la Fenêtre d'Activité consomme/gère l'événement. Si vous touchez laButton
, leButton
consommera des événements, de sorte que l'Activité ne sera pas en mesure de gérer.Consultez les articles suivants pour en savoir plus sur Android Tactile de la gestion des Événements de pipeline.
http://pierrchen.blogspot.jp/2014/03/pipeline-of-android-touch-event-handling.html
vous pouvez également essayer
onUserInteraction()
:fonctionne bien pour moi!
utilisation
public boolean dispatchTouchEvent(MotionEvent event)
plutôt suronTouchEvent()