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


195

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

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

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

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

Ответы:


419

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

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


1
Я не должен делать никакой другой очистки, чтобы отменить регистрацию события?
Джош

2
Нет. Слушатель - это просто объект, который представление использует для вызова метода, когда вы щелкаете, поэтому, когда вы устанавливаете его в ноль, он уничтожает его.
Робби Понд

15
Интересно, слушатели вызывают распределение памяти? Нужно ли их освобождать? Это поднимет производительность приложения?
alicanbatur

2
Спасибо за ваш ответ, добавьте, почему вы считаете, что проверка статуса или флага в слушателе лучше.
kapv89

2
Когда вы говорите a better design, подразумеваете ли вы последствия для производительности или просто говорите, что это немного неприятно?
RTF

132

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


Это хорошо знать для TextView и тому подобного, но для ListView это не имеет никакого эффекта, когда OnClickListener был предварительно установлен.
Кто-то где-то

4
Вот почему я написал «Обратите внимание, что если представление не реагирует на нажатие (например, на TextView)» - ListView активируется, и это не работает для него.
FreewheelNat

Если нам нужно переключаться назад и вперед, чтобы отключить / включить onClickListener View, на мой взгляд, это лучшее решение, чем установка setOnClickListener (null).
Panini Luncher

1
view.setOnClickListener (null) вместе с view.setClickable (false) - правильный ответ, спасибо !!!!
Петрос Мастрантонас

12

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


1
Это не работает специально для флажков, и, вероятно, не будет работать и для других виджетов.
Крис

8

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

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

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

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

Слава Богу. Это проверяет null.

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


4

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

То, что работало для меня, использовало setEnabled.

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

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

boolean ImageView.isEnabled();

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



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

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

mTitleView = findViewById (R.id.mTitleView);

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.