Удалить слушателя onclick - PullRequest
       43

Удалить слушателя onclick

174 голосов
/ 04 марта 2011

У меня есть объект, где текст циклически отображает сообщения о состоянии. Когда сообщения меняются, я хочу, чтобы событие щелчка объекта изменилось, чтобы перейти к активности, к которой относится сообщение.

Итак, у меня есть TextView mTitleView, и я назначаю событие следующим образом.

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

Как мне удалить это событие? Есть некоторые сообщения о состоянии, которые не имеют активной области, поэтому я хотел бы отключить событие click. Я также хотел бы иметь возможность циклически проходить через эти события щелчка и правильно их утилизировать, но я не уверен в лучшей практике.

Ответы [ 8 ]

388 голосов
/ 04 марта 2011

mTitleView.setOnClickListener(null) должен сделать свое дело.

Лучшим вариантом может быть проверка состояния в OnClickListener, а затем определение, должен ли щелчок что-то делать в сравнении с добавлением и очисткой прослушивателей щелчков.

123 голосов
/ 26 октября 2012

Обратите внимание, что если представление не активируется (например, TextView), установка setOnClickListener(null) будет означать, что представление кликабельно. Используйте mMyView.setClickable(false), если вы не хотите, чтобы ваш вид был кликабельным. Например, если вы используете для фона оттенок xml, который отображает разные цвета для разных состояний, если ваш вид еще кликабелен, пользователи могут щелкнуть по нему, и появится другой цвет фона, который может выглядеть странно.

11 голосов
/ 04 марта 2011

Возможно setOnClickListener(null)?

8 голосов
/ 29 декабря 2015

Настройка setOnClickListener(null) - это хорошая идея удалить прослушиватель щелчков во время выполнения.

А также кто-то заметил, что после вызова View.hasOnClickListeners() после этого вернется true, NO мой друг.

Вот реализация hasOnClickListeners(), взятая из android.view.View class

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

Слава Богу. Проверяется на null.

Так что все в порядке. Наслаждайтесь: -)

2 голосов
/ 27 апреля 2017

Просто поставь, у меня это сработало

itemView.setOnClickListener(null);
2 голосов
/ 22 января 2016
    /**
 * 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();
        }

    }
}
2 голосов
/ 22 декабря 2015

Приведенные выше ответы кажутся несерьезными и ненадежными.Я попытался сделать это с помощью ImageView в простом относительном макете, и он не отключил событие onClick.

Что мне помогло, так это использование setEnabled.

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

Затем можно проверить,представление активируется с помощью:

boolean ImageView.isEnabled();

Другим вариантом является использование setContentDescription (String string) и String getContentDescription () для определения состояния представления.

0 голосов
/ 06 февраля 2019

Просто повторная инициализация элемента, как показано ниже, поможет. Он удалит onclick, onlonglick, onitemclick, onitemlongclick на основе элемента

mTitleView = findViewById (R.id.mTitleView);

...