web-dev-qa-db-fra.com

Comment transmettre l'événement onClick d'une vue à son parent sous Android?

J'ai un TextView dans une mise en page dont l'arrière-plan est un sélecteur. Et le texte de TextView est défini sur Etendu à partir de HTML . Ensuite, je règle TextView avec LinkMovementMethod.

Maintenant, lorsque je tape sur TextView, l'événement click n'est pas envoyé à sa disposition parent pour déclencher le sélecteur.

Comment cela devrait-il être résolu?

84
shiami

Je pense que vous devez utiliser l'une de ces méthodes pour pouvoir intercepter l'événement avant qu'il ne soit envoyé aux composants appropriés:

Activity.dispatchTouchEvent(MotionEvent) - Ceci permet à votre activité d'intercepter tous les événements tactiles avant qu'ils ne soient envoyés à la fenêtre.

ViewGroup.onInterceptTouchEvent(MotionEvent) - Cela permet à un groupe de vues de voir les événements au fur et à mesure qu'ils sont envoyés aux vues enfants.

ViewParent.requestDisallowInterceptTouchEvent(boolean) - Appelez une vue parent pour indiquer qu'elle ne doit pas intercepter les événements tactiles avec onInterceptTouchEvent (MotionEvent).

Plus d'informations ici .

J'espère que cela pourra aider.

43
Luis Miguel Serrano

Déclarez que votre TextView n'est pas cliquable/focalisable en utilisant Android:clickable="false" et Android:focusable="false" ou v.setClickable(false) et v.setFocusable(false) Les événements de clic doivent maintenant être envoyés au parent de la TextView.

Remarque:

Pour y parvenir, vous devez ajouter un clic à sa parent directe. ou définissez Android:clickable="false" et Android:focusable="false" sur son parent direct pour transmettre le programme d'écoute à un autre parent .

185
siyb

Parfois seulement cela aide:

View child = parent.findViewById(R.id.btnMoreText);
    child.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            View parent = (View) v.getParent();
            parent.performClick();
        }
    });

Une autre variante ne fonctionne pas toujours:

child.setOnClickListener(null);
14
Alexander Ukhov

Mettre

Android:duplicateParentState="true"

dans enfant, les vues obtiennent son état dessinable (focalisé, appuyé, etc.) de son parent direct plutôt que de lui-même . vous pouvez définir onclick pour parent et faire appel à l'enfant sur lequel vous avez cliqué

8
Ahmad Ronagh

Si votre TextView crée des problèmes de clic, supprimez Android:inputType="" de votre fichier xml. 

3
Sanjay Chaudhary

Si vous voulez à la fois OnTouch et OnClick écouteur à parent et enfant voir les deux, veuillez utiliser l'astuce ci-dessous:

  1. ScrollView utilisateur en tant que vue parent et à l'intérieur de celui qui a placé votre vue enfant dans Relative/LinearLayout.

  2. Assurez Parent ScrollView Android:fillViewport="true" afin que la vue ne soit pas défilée.

  3. Définissez ensuite OnTouch auditeur sur parent et OnClick auditeur sur Vues enfant ..__ et profitez des rappels de l'écouteur.

0
Kishor Patil

Cette réponse est similaire à La réponse d'Alexandre Ukhov , sauf qu'elle utilise des événements tactiles plutôt que des événements de clic. Ces événements permettent au parent d’afficher les états pressés appropriés (par exemple, effet d’ondulation). Cette réponse est également en Kotlin au lieu de Java.

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}
0
methodsignature