Xóa một trình nghe onclick


194

Tôi có một đối tượng trong đó văn bản chu kỳ và hiển thị thông báo trạng thái. Khi các thông báo thay đổi, tôi muốn sự kiện nhấp của đối tượng thay đổi để đưa bạn đến hoạt động mà thông báo có liên quan.

Vì vậy, tôi có một TextView mTitleViewvà tôi đang chỉ định sự kiện như thế này.

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

Làm cách nào để xóa sự kiện nhấp đó? Có một số thông báo trạng thái không có khu vực có thể thao tác nên tôi muốn tắt sự kiện nhấp chuột. Tôi cũng muốn có thể xoay vòng qua các sự kiện nhấp chuột này và xử lý chúng đúng cách, nhưng tôi không chắc về cách thực hành tốt nhất.

Câu trả lời:


416

mTitleView.setOnClickListener(null) nên làm thủ thuật.

Một thiết kế tốt hơn có thể là kiểm tra trạng thái trong OnClickListener và sau đó xác định xem liệu nhấp chuột có nên làm gì đó so với việc thêm và xóa người nghe nhấp chuột hay không.


1
Tôi không phải dọn dẹp gì khác để hủy đăng ký sự kiện?
Josh

2
Không. Trình nghe chỉ là một đối tượng mà khung nhìn sử dụng để gọi một phương thức khi bạn nhấp để khi bạn đặt nó thành null, nó sẽ phá hủy nó.
Robby Pond

15
tôi tự hỏi nếu người nghe gây ra phân bổ bộ nhớ? Chúng ta có cần giải phóng chúng không? Điều đó sẽ nâng cao hiệu suất của ứng dụng?
alicanbatur

1
Cảm ơn câu trả lời của bạn, hãy nhớ thêm lý do tại sao bạn nghĩ rằng kiểm tra trạng thái hoặc cờ trong trình nghe là tốt hơn.
kapv89

2
Khi bạn nói bạn a better designđang ám chỉ hiệu suất hiệu suất hay bạn chỉ đang nói điều đó hơi khó chịu?
RTF

132

Lưu ý rằng nếu một chế độ xem là không thể nhấp (ví dụ: TextView), cài đặt setOnClickListener(null)sẽ có nghĩa là chế độ xem có thể nhấp được. Sử dụng mMyView.setClickable(false)nếu bạn không muốn chế độ xem của mình có thể nhấp được. Ví dụ: nếu bạn sử dụng xml drawable cho nền, hiển thị các màu khác nhau cho các trạng thái khác nhau, nếu chế độ xem của bạn vẫn có thể nhấp, người dùng có thể nhấp vào nó và màu nền khác nhau sẽ hiển thị, trông có vẻ lạ.


Điều này là tốt để biết cho TextView và như vậy, nhưng đối với ListView, nó không có tác dụng khi OnClickListener được đặt trước đó.
Ai đó ở đâu đó

4
Đây là lý do tại sao tôi đã viết "Lưu ý rằng nếu một chế độ xem không thể nhấp được (ví dụ như TextView)" - ListView có thể nhấp được và do đó, chế độ xem này không hoạt động.
FreewheelNat

Nếu chúng ta cần chuyển đổi qua lại để tắt / bật onClickListener của View, theo tôi, đây là giải pháp tốt hơn so với cài đặt setOnClickListener (null).
Bữa trưa Panini

1
view.setOnClickListener (null) cùng với view.setClickable (false) là câu trả lời đúng, cảm ơn !!!!
Petros Mastrantonas

12

Có lẽ setOnClickListener(null)?


1
Điều này không hoạt động cho các hộp kiểm cụ thể, và có khả năng cũng sẽ không hoạt động cho các vật dụng khác.
Chris

8

Cài đặt setOnClickListener(null) là một ý tưởng tốt để loại bỏ người nghe nhấp chuột trong thời gian chạy.

Và cũng có người nhận xét rằng gọi View.hasOnClickListeners()sau này sẽ trở lại true, KHÔNG bạn của tôi.

Đây là việc thực hiện hasOnClickListeners()lấy từ android.view.Viewlớp

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

Cảm ơn Chúa. Nó kiểm tranull .

Vì vậy, mọi thứ đều an toàn. Thưởng thức :-)


4

Các câu trả lời trên có vẻ như bay và không đáng tin cậy. Tôi đã thử làm điều này với ImageView trong Bố cục tương đối đơn giản và nó không vô hiệu hóa sự kiện onClick.

Những gì đã làm việc cho tôi là sử dụng setEnables.

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

Sau đó, bạn có thể kiểm tra xem Chế độ xem có được bật hay không:

boolean ImageView.isEnabled();

Một tùy chọn khác là sử dụng setContentDescrip (Chuỗi chuỗi) và Chuỗi getContentDescrip () để xác định trạng thái của chế độ xem.


4

Chỉ cần đặt, nó đã làm việc cho tôi

itemView.setOnClickListener(null);

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

Chỉ cần khởi động lại mục như dưới đây sẽ thực hiện các mẹo. Nó sẽ xóa onclick, onlonglick, onitemclick, onitemlongclick dựa trên vật phẩm

mTitleView = findViewById (R.id.mTitleView);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.