Видаліть слухач onclick


195

У мене є об'єкт, де текст циклично відображає та відображає повідомлення про стан. Коли повідомлення змінюються, я хочу, щоб подія об’єкта, що змінюється, змінилася, щоб перенести вас на діяльність, до якої стосується повідомлення.

Отже, у мене є, TextView mTitleViewі я призначаю подію, як це.

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

Як видалити цю подію натискання? Є деякі повідомлення про стан, які не мають діючої області, тому я хотів би вимкнути подію натискання. Я також хотів би мати можливість перейти через ці події клацання та утилізувати їх належним чином, але я не впевнений у найкращій практиці.

Відповіді:


419

mTitleView.setOnClickListener(null) повинен зробити трюк.

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


1
Немає жодної іншої очистки, яку я повинен зробити, щоб скасувати реєстрацію події?
Джош

2
Ні. Слухач - це просто об'єкт, який перегляд використовує для виклику методу при натисканні, коли ви встановите його на нуль, він знищує його.
Robby Pond

15
мені цікаво, чи викликають слухачі виділення пам'яті? Чи потрібно їх звільняти? Чи це підвищить ефективність програми?
alicanbatur

2
Дякуємо за вашу відповідь, пам’ятаючи, що ви вважаєте, чому ви вважаєте, що перевірити стан або прапор у слухача краще.
kapv89

2
Коли ви говорите, a better designчи ви маєте на увазі наслідки для продуктивності чи ви просто говорите, що це трохи неприємно?
RTF

132

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


Це добре знати для TextView і подібних, але для ListView це не впливає, коли OnClickListener був раніше встановлений.
Хтось десь

4
Ось чому я написав "Зауважте, що якщо представлення не можна натискати (наприклад, TextView)" - ListView можна натискати, і це не працює для нього.
FreewheelNat

Якщо нам потрібно переключитися вперед і назад, щоб відключити / включити View onClickListener, на мій погляд, це краще рішення, ніж встановлення setOnClickListener (null).
Пані Ланчер

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 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.