Comment trouver la vue source d'un MotionEvent ACTION_CANCEL

Comment puis-je trouver la vue provoquant un MotionEvent ACTION_CANCEL? J'ai une vue "A" qui reçoit ACTION_CANCEL et je ne veux pas que cela se produise. Quelque part, une vue "B" "consomme" le MotionEvent. J'espère qu'il existe un moyen de savoir qui est «B» afin que je puisse résoudre cette dysfonctionnalité.

J'ai essayé de regarder mon code pour différents gestionnaires OnTouchEvent () et OnInterceptTouchEvent () mais je n'ai pas encore trouvé de coupable.

  • Comment utiliser le SSL avec une multi-entité sur Android
  • Comment puis-je passer des données sur Android Market en utilisant le nouveau schéma sur chrome?
  • Lecture simultanée simultanément de vidéos simultanément
  • Événements à proximité dans une ville pour une application Android
  • Comment faire en sorte que SharedPreferences à partir d'une PréférenceActivité soit définie par défaut dans Android?
  • Comment remplacer le fichier de base de données sqlite existant par un nouveau fichier de base de données dans Android
  • J'ai également mis un point de coupure à l'ACTION_CANCEL problématique, mais je ne peux rien reconnaître dans MotionEvent qui pourrait représenter "B".

  • Apache Cordova app crashes après réception de parse.com notification push
  • Lire le fichier d'actifs en tant que chaîne
  • Arrêtez le setrepeat de Android alarmmanager
  • Pourquoi mon compte Facebook android sdk est-il appelé deux fois?
  • Gotchas lors de l'utilisation de Google Analytics pour Android SDK
  • Comment implémenter HorizontalScrollView comme Galerie?
  • 3 Solutions collect form web for “Comment trouver la vue source d'un MotionEvent ACTION_CANCEL”

    Si un parent intercepte l'événement de mouvement, la seule façon d'éviter cela est d'empêcher le parent d'intercepter cet événement. Cela peut être bien géré de deux façons.

    Sans consulter un code spécifique et vouloir une solution généralisée, je suggérerais ce qui suit.

    Je suggère de gérer vos événements tactiles pour les parents et l'enfant en gérant le
    RequestDisallowInterceptTouchEvent (boolean) et

    OnInceptceptTouchEvent (android.view.MotionEvent) gestionnaires d'événements de chaque vue / groupe de vues dans les vues affectées A, B C.

    En refusant les interceptions parentales chez l'enfant, cela vous aide à attraper les interceptions parentales que vous n'avez pas prises en compte et à personnaliser et à modifier les éléments enfants dans un même parent.

    Cela doit être géré à partir de votre parent le plus élevé de votre vue / viewGroup et géré par toutes les relations parent et enfant.

    Vérification des listes d'affichage, tout élément comportant des événements tactiles intégrés.

    Android.com/training/gestures/viewgroup

    En ce qui concerne la recherche de la vue offensive qui intercepte l'événement, cela ne peut être répondu que par la logique de:

    Passez par chaque parent à la vue enfant / parent à enfant. Vérifiez méthodiquement la gestion de l'environnement dans chaque groupe de vue / vue comme indiqué dans mon diagramme.

    Voir schéma

    Il y a plus de détails dans ces réponses:
    https://stackoverflow.com/a/30966413/3956566
    https://stackoverflow.com/a/6384443/3956566

    Je suis sûr que vous comprenez cela, mais pour moi, c'est la solution la plus simple.

    Au-delà, nous devrions examiner votre code pour le dépanner.

    Si j'ai bien ACTION_CANCEL , vous recevez ACTION_CANCEL probablement dans le parent et vous devez trouver cette vue. Compte tenu de l'événement X et Y, vous pouvez trouver une vue qui contient ces coordonnées au premier moment où ACTION_CANCEL s'est produite. Essayez d'appeler cette méthode soit avec le parent principal ( ViewGroup Android.R.id.content), soit avec le ViewGroup avec ViewGroup vous rencontrez.

     private View findViewAt(View contentView, int eventX, int eventY) { ArrayList<View> unvisited = new ArrayList<View>(); unvisited.add(contentView); while (!unvisited.isEmpty()) { View child = unvisited.remove(0); if(isViewContains(child, eventX, eventY) { Log.i(TAG, "view found! "); unvisited.clear(); return child; } if (!(child instanceof ViewGroup)){ continue; } ViewGroup group = (ViewGroup) child; final int childCount = group.getChildCount(); for (int i=0; i< childCount; i++){ unvisited.add(group.getChildAt(i)); } } return null; } private boolean isViewContains(View view, int eventX, int eventY) { int[] location = new int[2]; view.getLocationOnScreen(location); int x = location[0]; int y = location[1]; int width = view.getWidth(); int height = view.getHeight(); return eventX < x || eventX > x + width || eventY < y || eventY > y + height; } 

    Sur mon expérience, un cas qui fait que la vue A reçoit un événement ACTION_CANCEL est après que A est touché par les utilisateurs et qu'ils arrachent leur doigt hors de la zone de A, Si vous faites face à cette affaire, Ajoutez une méthode pour vérifier l'emplacement sur dispatchTouchEvent () peut Aidez-moi.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.