J'ai un LinearLayout personnalisé avec un enfant TextView plus petit. J'aimerais pouvoir cliquer sur la zone non couverte par TextView. Je définis donc clickable = true et onclicklistener sur LinearLayout, mais onClick n'est pas déclenché. Si je configure l'écouteur onclick sur le TextView, cela fonctionne comme prévu ...
Quelqu'un peut aider?
ar_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/ar_item" Android:layout_width="202dp"
Android:layout_height="62dp" Android:background="@drawable/bg_item_ar"
Android:clickable="true">
<TextView Android:id="@+id/ar_item_txt"
Android:layout_width="164dp" Android:layout_height="fill_parent"
Android:paddingBottom="8dp" Android:paddingLeft="8dp"
Android:paddingTop="8dp" Android:paddingRight="6dp" Android:gravity="center"
Android:background="#50000000" />
</LinearLayout>
Mon LinearLayout personnalisé
public class ARView extends LinearLayout
{
public ARView(final Context context, String name, String 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 rendre votre mise en page cliquable avec ses enfants, vous devez ajouter cette option pour chaqueenfant:
Android:clickable="false"
Ensuite, le traitement des clics irauptoparent.
Ce n'est pas votre cas, mais j'avais un problème similaire avec la variable ViewGroup
cliquable. Après une heure de recherche de solution, il a découvert que je définissais Android:inputType
à TextView
dans mon ViewGroup
qui bloquait l'écouteur onClick()
(je ne sais pas 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:
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
Rendre Android de votre parent LinearLayout: clickable = "true"
Rendre tous les Android de la vue enfant: clickable = "false"
Sous Linearlayout - Supprimer Android: inputType = "" à partir de TextView
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 les FrameLayouts (où votre sous LinearLayout peut être couvert) ou avec les dispositions relatives que vous avez peut-être oublié de mettre à jour cette ligne:
Android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
afin que les vues ne remplissent pas le même espace.
Le Android:duplicateParentState="true"
de 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 TextViewclickable="false"
. Ainsi, l'événement click sera envoyé à la disposition parente et le TextView peut toujours réagir à l'événement tactile (avec effet d'entraînement).
Votre hauteur TextView couvre tout le parent (toute la mise en page). 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 le port d'écoute de la mise en page.
Ajoutez les attributs suivants à la structure linéaire Tous les événements Click non gérés par les vues enfant seront automatiquement transférés à LinearLayout.
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
...
Android:focusable="true"
Android:clickable="true">
<child/>
<child/>
</LinearLayout>
J'ai rencontré le même problème et tous les attributs XML ne fonctionnaient pas. Je pense que cela se produit parce que je gonfle et ajoute les vues par programme. Le correctif pour moi était - également celui par programmation - de ne pas cliquer sur la vue racine gonflée
View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);
(Oui, j'ai essayé d'avoir le some_layout
non cliquable en XML.)
Le problème peut provenir de la vue texte qui a Android:layout_height="fill_parent"
dans sa disposition. Si cela ne résout pas le problème, il peut s'agir de l'événement onClick (). La disposition linéaire peut ne jamais appeler onClick () puisque c'est une disposition. Essayez de remplacer l'écouteur d'événement onTouch () à la place.
Aucune des solutions ci-dessus ne m'a été proposée. J'ai alors remarqué qu'une LinkMovementMethod
définie à TextView
dans ma LinearLayout
. Cette classe intercepte les événements tactiles, les événements de clic et les propriétés de TextView
, tels que cliquable, focusable vs.
Si les vues en question sont TextView
s, vous devrez peut-être les définir en tant que focusable="false"
afin que le premier clic ne soit pas utilisé en se concentrant sur la vue texte.
J'ai rencontré le même problème et tous les attributs XML ne fonctionnaient pas. Je ne sais pas si cela se produit parce que je gonfle et ajoute les vues par programmation, mais c'est ainsi que j'ai résolu 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 récupéré les vues, j'ai attribué à la vue enfant un OnClickListener, lorsqu'il est enfoncé, 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 contourner OnTouchListener, mais mes vues enfant n'avaient alors pas d'effet d'entraînement, ce dont j'avais besoin.