Hapus pendengar onclick

194

Saya memiliki objek tempat teks berputar dan menampilkan pesan status. Ketika pesan berubah, saya ingin acara klik objek berubah untuk membawa Anda ke aktivitas yang terkait dengan pesan tersebut.

Jadi, saya punya TextView mTitleViewdan saya menugaskan acara seperti ini.

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

Bagaimana cara menghapus acara klik itu? Ada beberapa pesan status yang tidak memiliki area yang dapat ditindaklanjuti sehingga saya ingin mematikan acara klik. Saya juga ingin dapat melihat-lihat peristiwa klik ini dan membuangnya dengan benar, tetapi saya tidak yakin dengan praktik terbaik.

Josh
sumber

Jawaban:

416

mTitleView.setOnClickListener(null) harus melakukan trik.

Desain yang lebih baik mungkin untuk melakukan pemeriksaan status di OnClickListener dan kemudian menentukan apakah klik harus melakukan sesuatu vs menambah dan menghapus pendengar klik.

Robby Pond
sumber
1
Tidak ada pembersihan lain yang harus saya lakukan untuk membatalkan pendaftaran acara?
Josh
2
Nggak. Pendengar hanyalah objek yang digunakan tampilan untuk memanggil metode ketika Anda mengklik sehingga ketika Anda mengaturnya untuk null itu merusaknya.
Robby Pond
15
saya bertanya-tanya apakah pendengar menyebabkan alokasi memori? Apakah kita perlu membebaskan mereka? Apakah itu akan meningkatkan kinerja aplikasi?
alicanbatur
2
Terima kasih atas jawaban Anda, keberatan menambahkan mengapa Anda berpikir bahwa memeriksa status atau bendera di pendengar lebih baik.
kapv89
2
Ketika Anda mengatakan a better designapakah Anda menyiratkan implikasi kinerja atau Anda hanya mengatakan itu agak tidak menyenangkan?
RTF
132

Perhatikan bahwa jika tampilan tidak dapat diklik (misalnya TextView), pengaturan setOnClickListener(null)akan berarti tampilan tersebut dapat diklik. Gunakan mMyView.setClickable(false)jika Anda tidak ingin tampilan Anda dapat diklik. Misalnya, jika Anda menggunakan xml drawable untuk latar belakang, yang menunjukkan warna berbeda untuk status berbeda, jika tampilan Anda masih dapat diklik, pengguna dapat mengkliknya dan warna latar belakang yang berbeda akan ditampilkan, yang mungkin terlihat aneh.

FreewheelNat
sumber
Ini bagus untuk diketahui untuk TextView dan semacamnya, tetapi untuk ListView tidak ada efeknya ketika OnClickListener sebelumnya ditetapkan.
Seseorang di suatu tempat
4
Inilah sebabnya saya menulis "Perhatikan bahwa jika tampilan tidak dapat diklik (misalnya TextView)" - ListView dapat diklik sehingga ini tidak berfungsi untuk itu.
FreewheelNat
Jika kita perlu bolak-balik untuk menonaktifkan / mengaktifkan View's onClickListener, menurut pendapat saya, ini adalah solusi yang lebih baik daripada pengaturan setOnClickListener (null).
Panini Luncher
1
view.setOnClickListener (null) bersama dengan view.setClickable (false) adalah jawaban yang benar, terima kasih !!!!
Petros Mastrantonas
12

Mungkin setOnClickListener(null)?

Luther
sumber
1
Ini tidak berfungsi untuk kotak centang secara khusus, dan kemungkinan juga tidak akan berfungsi untuk widget lain.
Chris
8

Pengaturan setOnClickListener(null)adalah ide yang baik untuk menghapus pendengar klik saat runtime.

Dan juga seseorang berkomentar bahwa menelepon View.hasOnClickListeners()setelah ini akan kembali true, TIDAK teman saya.

Berikut ini implementasi yang hasOnClickListeners()diambil dari android.view.Viewkelas

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

Terima kasih Tuhan. Itu memeriksa null.

Jadi semuanya aman. Nikmati :-)

Azim Ansari
sumber
4

Jawaban di atas tampak tidak jelas dan tidak dapat diandalkan. Saya mencoba melakukan ini dengan ImageView dalam Layout Relatif sederhana dan tidak menonaktifkan acara onClick.

Apa yang berhasil bagi saya adalah menggunakan setEnabled.

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

Anda kemudian dapat memeriksa apakah Tampilan diaktifkan dengan:

boolean ImageView.isEnabled();

Pilihan lain adalah menggunakan setContentDescription (String string) dan String getContentDescription () untuk menentukan status tampilan.

Brandon Thompson
sumber
4

Sederhananya, itu berhasil bagi saya

itemView.setOnClickListener(null);
Sai Gopi N
sumber
3
    /**
 * 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();
        }

    }
}
androidmalin
sumber
0

Cukup menginisialisasi ulang item seperti di bawah ini akan melakukan trik. Itu akan menghapus onclick, onlonglick, onitemclick, onitemlongclick berdasarkan item

mTitleView = findViewById (R.id.mTitleView);

Rockit Rockit
sumber