Supprimer un écouteur onclick


194

J'ai un objet où le texte passe et affiche des messages d'état. Lorsque les messages changent, je veux que l'événement de clic de l'objet change pour vous amener à l'activité à laquelle le message se rapporte.

Donc, j'en ai un TextView mTitleViewet j'assigne l'événement comme ça.

public void setOnTitleClickListener(OnClickListener listener) {
    mTitleView.setOnClickListener(listener);
}

Comment supprimer cet événement de clic? Il y a certains messages d'état qui n'ont pas de zone actionnable, je voudrais donc désactiver l'événement de clic. J'aimerais également pouvoir parcourir ces événements de clic et les éliminer correctement, mais je ne suis pas sûr de la meilleure pratique.

Réponses:


416

mTitleView.setOnClickListener(null) devrait faire l'affaire.

Une meilleure conception pourrait consister à vérifier l'état dans OnClickListener, puis à déterminer si le clic doit ou non faire quelque chose par rapport à l'ajout et à la suppression d'écouteurs de clics.


1
Il n'y a pas d'autre nettoyage que je dois faire pour désenregistrer l'événement?
Josh

2
Nan. L'écouteur n'est qu'un objet que la vue utilise pour appeler une méthode lorsque vous cliquez dessus, donc lorsque vous la définissez sur null, elle la détruit.
Robby Pond

15
je me demande si les auditeurs causent l'allocation de mémoire? Faut-il les libérer? Cela augmentera-t-il les performances de l'application?
alicanbatur

2
Merci pour votre réponse, pensez à ajouter pourquoi pensez-vous qu'il est préférable de vérifier l'état ou un indicateur dans l'auditeur.
kapv89

2
Lorsque vous dites que a better designvous sous-entendez des implications en termes de performances ou que vous dites simplement que c'est un peu désagréable?
RTF

132

Notez que si une vue n'est pas cliquable (une TextView par exemple), la définition setOnClickListener(null)signifie que la vue est cliquable. À utiliser mMyView.setClickable(false)si vous ne souhaitez pas que votre vue soit cliquable. Par exemple, si vous utilisez un dessin xml pour l'arrière-plan, qui affiche différentes couleurs pour différents états, si votre vue est toujours cliquable, les utilisateurs peuvent cliquer dessus et la couleur d'arrière-plan différente s'affichera, ce qui peut sembler étrange.


C'est bon à savoir pour TextView et autres, mais pour un ListView, cela n'a aucun effet lorsqu'un OnClickListener a été précédemment défini.
Someone Somewhere

4
C'est pourquoi j'ai écrit "Notez que si une vue n'est pas cliquable (une TextView par exemple)" - une ListView est cliquable et donc cela ne fonctionne pas pour elle.
FreewheelNat

Si nous devons basculer pour désactiver / activer la vue onClickListener de la vue, à mon avis, c'est la meilleure solution que de définir setOnClickListener (null).
Panini Luncher

1
view.setOnClickListener (null) avec view.setClickable (false) est la bonne réponse, merci !!!!
Petros Mastrantonas

12

Peut setOnClickListener(null)- être ?


1
Cela ne fonctionne pas spécifiquement pour les cases à cocher et ne fonctionnera probablement pas pour les autres widgets également.
Chris

8

Le réglage setOnClickListener(null)est une bonne idée pour supprimer l'écouteur de clics lors de l'exécution.

Et aussi quelqu'un a commenté qu'appeler View.hasOnClickListeners()après cela reviendra true, NON mon ami.

Voici l'implémentation des hasOnClickListeners()prises de android.view.Viewclasse

 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }

Dieu merci. Il vérifie null.

Donc, tout est en sécurité. Prendre plaisir :-)


4

Les réponses ci-dessus semblent instables et peu fiables. J'ai essayé de le faire avec une ImageView dans une mise en page relative simple et cela n'a pas désactivé l'événement onClick.

Ce qui a fonctionné pour moi, c'est d'utiliser setEnabled.

ImageView v = (ImageView)findViewByID(R.id.layoutV);
v.setEnabled(false);

Vous pouvez ensuite vérifier si la vue est activée avec:

boolean ImageView.isEnabled();

Une autre option consiste à utiliser setContentDescription (String string) et String getContentDescription () pour déterminer l'état d'une vue.


4

En résumé, cela a fonctionné pour moi

itemView.setOnClickListener(null);

3
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author malin.myemail@gmail.com
 * @website https://github.com/androidmalin
 * @data 2016-05-16
 */
public static void unBingListener(View view) {
    if (view != null) {
        try {
            if (view.hasOnClickListeners()) {
                view.setOnClickListener(null);

            }

            if (view.getOnFocusChangeListener() != null) {
                view.setOnFocusChangeListener(null);

            }

            if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
                ViewGroup viewGroup = (ViewGroup) view;
                int viewGroupChildCount = viewGroup.getChildCount();
                for (int i = 0; i < viewGroupChildCount; i++) {
                    unBingListener(viewGroup.getChildAt(i));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

0

Réinitialiser simplement l'élément comme ci-dessous ferait l'affaire. Il supprimerait onclick, onlonglick, onitemclick, onitemlongclick basé sur l'élément

mTitleView = findViewById (R.id.mTitleView);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.