web-dev-qa-db-fra.com

onClick non déclenché sur LinearLayout avec l'enfant

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();
            }
        });
    }
}
48
jul

pour chaque enfant

Android: duplicateParentState = "true"

54
Blackbelt

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.

80
Yurets

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

20
elementstyle

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

<com.yourcode.ARView ...> ... </com.yourcode.ARView>
2
cdhabecker

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

1
Ahamadullah Saikat

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.

1
ColossalChris

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).

1
nhoxbypass

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.

1
Nikola Despotoski

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>
0
Sanket Berde

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.)

0
Roy Solberg

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.

0
A. Abiri

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. 

0
savepopulation

Si les vues en question sont TextViews, 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.

0
CorayThan

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.

0
Gilles Braun