web-dev-qa-db-fra.com

Supprimer un auditeur onclick

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

Donc, j'ai un TextView mTitleView et j'attribue l'événement comme ceci.

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

Comment puis-je supprimer cet événement de clic? Certains messages d'état n'ayant pas de zone d'action, j'aimerais désactiver l'événement click. J'aimerais aussi pouvoir parcourir ces événements de clic et les éliminer correctement, mais je ne suis pas sûr de la meilleure pratique.

166
Josh

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

Une meilleure conception pourrait consister à vérifier l'état de OnClickListener, puis à déterminer si le clic doit faire quelque chose ou non, en ajoutant ou en supprimant des écouteurs de clic.

374
Robby Pond

Notez que si une vue est non-cliquable (une TextView par exemple), définir setOnClickListener(null) signifiera que la vue est cliquable. Utilisez mMyView.setClickable(false) si vous ne voulez pas que votre vue soit cliquable. Par exemple, si vous utilisez un fichier XML dessinable 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 paraître étrange. 

116
FreewheelNat

Peut-être setOnClickListener(null)

11
Luther

La définition de setOnClickListener(null) est une bonne idée pour supprimer le programme d'écoute de clic au moment de l'exécution. 

Et aussi quelqu'un a commenté que l'appel de View.hasOnClickListeners() après cela retournera true,NOmon ami. 

Voici l'implémentation de hasOnClickListeners() extraite de Android.view.View class

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

8
Azim Ansari

Il suffit de mettre, cela a fonctionné pour moi

itemView.setOnClickListener(null);
2
saigopi

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

Ce qui a fonctionné pour moi utilisait 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 le statut d'une vue.

2
Brandon Thompson
    /**
 * 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();
        }

    }
}
2
androidmalin

Réinitialiser l’article comme ci-dessous ferait l'affaire. Il supprimerait onclick, onlonglick, onitemclick, onitemlongclick en fonction de

mTitleView = findViewById (R.id.mTitleView);

0
Rockit Rockit