onClick non déclenché sur LinearLayout avec child

J’ai un LinearLayout personnalisé avec un enfant TextView plus petit. Je voudrais pouvoir cliquer sur la zone non couverte par TextView, donc j’ai défini clickable = true et un onclicklistener sur LinearLayout, mais onClick n’est pas déclenché. Si je définis l’auditeur onclick sur le TextView, il fonctionne comme prévu …

Quelqu’un peut aider?

ar_item.xml

    

Mon LinearLayout personnalisé

 public class ARView extends LinearLayout { public ARView(final Context context, Ssortingng name, Ssortingng id) { super(context); getLayoutInflater().inflate(R.layout.ar_item, this ,true); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.ar_item, null); TextView textView = (TextView) findViewById(R.id.ar_item_txt); textView.setText(name); setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT); t.show(); } }); } } 

pour chaque enfant

android: duplicateParentState = “true”

android:duplicateParentState="true" ne m’a pas aidé.

Pour que votre mise en page soit cliquable avec ses enfants, vous devez append cette option pour chaque enfant :

  android:clickable="false" 

Ensuite, la manipulation des clics ira au parent .

Ce n’est pas votre cas, mais j’ai eu un problème similaire avec ViewGroup cliquable. Après une heure de recherche de solution, j’ai découvert que je définissais android:inputType à TextView dans mon ViewGroup qui bloquait le onClick() sans aucune idée de pourquoi.

Ne pas utiliser android:inputType avec TextView

Vous n’utilisez pas votre vue personnalisée; vous utilisez un LinearLayout standard. Votre balise XML devrait être:

  ...  

Votre hauteur TextView couvre l’intégralité du parent (disposition entière). Vous pouvez donc cliquer sur un espace vide mais pas sur la mise en page. Essayez d’utiliser wrap_content pour Android: layout_height pour votre TextView. Définissez également l’écouteur de clic pour la mise en page.

Une chose à vérifier est qu’une autre vue n’est pas au-dessus de la vue sur laquelle vous essayez de cliquer. Ceci est particulièrement courant dans FrameLayouts (où votre sous LinearLayout peut être couvert) ou avec des mises en page relatives que vous avez peut-être oublié de mettre à jour:

 android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered" 

afin que les vues ne remplissent pas le même espace.

L’ android:duplicateParentState="true" fait que mon TextView a l’ air d’être désactivé et ne peut pas recevoir d’événement de clic.

Tout ce dont vous avez besoin est de définir le TextView clickable clickable="false" . Ainsi, l’événement click sera envoyé à la mise en page parente et le TextView pourra toujours réagir à l’événement tactile (avec effet d’ondulation).

Rendre Android de votre parent LinearLayout : clickable = “true”

Faites tout le Android de la childview : clickable = “false”

Sous Linearlayout – Supprimer android: inputType = “” de TextView

Le problème peut provenir de la textview qui a android:layout_height="fill_parent" dans sa mise en page. Si cela ne résout pas le problème, le problème peut être l’événement onClick (). La disposition linéaire peut ne jamais appeler onClick () car elle est une mise en page. Essayez plutôt de remplacer le programme d’écoute d’événement onTouch ().

Si les vues en question sont des vues TextView , vous devrez peut-être les définir comme focusable="false" afin que le premier clic ne soit pas utilisé en se concentrant sur la vue texte.

Ajoutez les atsortingbuts suivants à linearlayout Tous les événements Click non gérés par les vues enfants seront automatiquement transmis à LinearLayout.

     

J’ai rencontré le même problème et tous les atsortingbuts XML ne fonctionnaient pas. Je ne sais pas si cela se produit parce que je gonfle et ajoute les points de vue par programmation, mais c’est ainsi que j’ai travaillé sur le problème.

J’ai une classe qui étend LinearLayout, avec un TextView et un ImageView. Après avoir gonflé la mise en page et obtenu les vues, j’ai affecté les vues enfants à un OnClickListener, lorsqu’il est pressé, exécute le onClickListner de LineaLayout.

 public class MyView extends LinearLayout { private OnClickListener clickListener; ImageView imageView; TextView textView; @Override public void setOnClickListener(@Nullable OnClickListener l) { super.setOnClickListener(l); clickListener = l; } void afterViews() { imageView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { clickListener.onClick(MyView.this); return false; } }); textView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { clickListener.onClick(MyView.this); return false; } }); } 

J’ai également essayé de remplacer OnTouchListener, mais les vues de mon enfant n’ont pas eu l’effet d’entraînement, ce dont j’avais besoin.

Aucune des solutions ci-dessus n’a tranché pour moi. J’ai remarqué qu’un object LinkMovementMethod défini sur TextView dans mon LinearLayout . Cette classe intercepte les événements tactiles, les événements de clic et les propriétés de TextView tels que cliquables, focalisables ou vs.