2010-12-11 78 views
61

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 Spanned from HTML. Ensuite, je définis le TextView avec le LinkMovementMethod. Maintenant, lorsque je tape sur le TextView, l'événement click n'est pas envoyé à sa mise en page parente pour déclencher le sélecteur.Comment passer l'événement onClick d'une vue à son parent sur Android?

Comment cela devrait-il être résolu?

Répondre

32

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

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

ViewGroup.onInterceptTouchEvent(MotionEvent) - Cela permet à un ViewGroup de regarder des événements tels qu'ils sont distribués aux vues enfant. - Appelez ceci sur une vue parente pour indiquer qu'elle ne doit pas intercepter les événements tactiles avec onInterceptTouchEvent (MotionEvent).

Plus d'informations here.

Espérons que cela aide.

+1

Existe-t-il un moyen plus simple de passer les événements pour déclencher onClick et onLongClick dans la vue parente, ou de les implémenter moi-même? – shiami

+0

Check this out: http://stackoverflow.com/questions/2136696/pass-event-to-parent-view Peut-être que vous pourriez vouloir essayer de passer le même écouteur de clic aux autres instances comme suggéré, même si je ne fais pas ' Je ne sais pas si ça va marcher, mais ça vaut le coup d'essayer. –

+0

Réponse ci-dessous est beaucoup plus propre – JPM

157

Déclarez votre TextView 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 être envoyés au parent de TextView maintenant.

Note:

Pour y parvenir, vous devez ajouter cliquer pour son parent direct. ou définir android:clickable="false" et android:focusable="false" à parent direct pour passer l'écouteur à l'autre parent.

+1

Oh man si je pouvais donner ce +100 je le ferais. Été essayer de comprendre comment faire un clic ne fonctionne que dans un ViewPager et pas dans la mise en page des adaptateurs avec TouchImageView mise en œuvre onTouch! Cette solution a fonctionné comme un charme. – JPM

+0

Fonctionne parfaitement. Beaucoup mieux que la réponse exceptée. – Rooster242

+0

mais si je veux gérer Focus changer l'événement de EditText? –

9

Quelque temps 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 travaille pas toujours:

child.setOnClickListener(null); 
4

Mettre

android:duplicateParentState="true" 

chez l'enfant alors les vues obtenir son état drawable (concentré, pressé, etc.) de son parent direct plutôt que de lui-même. vous pouvez définir onclick pour le parent et il faut cliquer sur l'enfant

3

Si votre TextView créer des problèmes de clic, que supprimer android:inputType="" de votre fichier XML.

+0

Je ne sais pas pourquoi, mais cela a fait l'affaire pour moi. Je vous remercie! –