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.
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.
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.
Peut-être setOnClickListener(null)
?
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 :-)
Il suffit de mettre, cela a fonctionné pour moi
itemView.setOnClickListener(null);
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.
/**
* 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();
}
}
}
Réinitialiser l’article comme ci-dessous ferait l'affaire. Il supprimerait onclick, onlonglick, onitemclick, onitemlongclick en fonction de
mTitleView = findViewById (R.id.mTitleView);