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.

Josh
la source

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.

Robby Pond
la source
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.

FreewheelNat
la source
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 ?

Luther
la source
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 :-)

Azim Ansari
la source
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.

Brandon Thompson
la source
4

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

itemView.setOnClickListener(null);
Sai Gopi N
la source
3
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author [email protected]
 * @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();
        }

    }
}
androidmalin
la source
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);

Rockit Rockit
la source