ลบผู้ฟัง onclick


195

ฉันมีวัตถุที่รอบข้อความและแสดงข้อความสถานะ เมื่อข้อความเปลี่ยนไปฉันต้องการให้เหตุการณ์การคลิกของวัตถุเปลี่ยนเพื่อนำคุณไปยังกิจกรรมที่ข้อความนั้นเกี่ยวข้อง

ดังนั้นฉันมีTextView mTitleViewและฉันกำหนดกิจกรรมเช่นนี้

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

ฉันจะลบกิจกรรมการคลิกนั้นได้อย่างไร มีข้อความสถานะบางส่วนที่ไม่มีพื้นที่ที่สามารถดำเนินการได้ดังนั้นฉันต้องการปิดกิจกรรมคลิก ฉันต้องการที่จะหมุนเวียนเหตุการณ์การคลิกเหล่านี้และกำจัดอย่างถูกต้อง แต่ฉันไม่แน่ใจเกี่ยวกับวิธีปฏิบัติที่ดีที่สุด

คำตอบ:


419

mTitleView.setOnClickListener(null) ควรทำเคล็ดลับ

การออกแบบที่ดีกว่าอาจทำการตรวจสอบสถานะใน OnClickListener จากนั้นพิจารณาว่าการคลิกควรทำอะไรบางอย่างกับการเพิ่มและการล้างตัวเลือกการคลิก


1
ไม่มีการล้างข้อมูลอื่น ๆ ที่ฉันต้องทำเพื่อลงทะเบียนเหตุการณ์?
Josh

2
Nope ฟังเป็นเพียงวัตถุที่มุมมองที่ใช้ในการเรียกวิธีการเมื่อคุณคลิกดังนั้นเมื่อคุณตั้งค่าให้เป็นโมฆะมันทำลายมัน
Robby Pond

15
ฉันสงสัยว่าผู้ฟังทำให้เกิดการจัดสรรหน่วยความจำหรือไม่? เราจำเป็นต้องปลดปล่อยพวกเขาให้เป็นอิสระหรือไม่? มันจะเพิ่มประสิทธิภาพของแอพไหม
alicanbatur

2
ขอบคุณสำหรับคำตอบของคุณโปรดเพิ่มเหตุผลที่คุณคิดว่าการตรวจสอบสถานะหรือการตั้งค่าสถานะในผู้ฟังดีกว่า
kapv89

2
เมื่อคุณพูดว่าคุณa better designกำลังแสดงนัยของการปฏิบัติงานหรือคุณแค่พูดว่ามันน่ารังเกียจเล็กน้อย
RTF

132

โปรดทราบว่าหากมุมมองนั้นไม่สามารถคลิกได้ (ตัวอย่างเช่น TextView) การตั้งค่าsetOnClickListener(null)จะหมายถึงมุมมองที่สามารถคลิกได้ ใช้mMyView.setClickable(false)หากคุณไม่ต้องการให้มุมมองของคุณสามารถคลิกได้ ตัวอย่างเช่นหากคุณใช้ xml drawable สำหรับพื้นหลังซึ่งแสดงสีที่แตกต่างกันสำหรับสถานะที่แตกต่างกันหากมุมมองของคุณยังคงสามารถคลิกได้ผู้ใช้สามารถคลิกที่มันและสีพื้นหลังที่แตกต่างกันจะปรากฏขึ้นซึ่งอาจดูแปลก


สิ่งนี้เป็นสิ่งที่ดีสำหรับ TextView และเช่นนี้ แต่สำหรับ ListView จะไม่มีผลเมื่อมีการตั้งค่า OnClickListener ไว้ก่อนหน้านี้
คนอยู่ที่ไหนสักแห่ง

4
นี่คือเหตุผลที่ฉันเขียน "โปรดสังเกตว่าหากมุมมองนั้นไม่สามารถคลิกได้ (เช่น TextView)" - ListView สามารถคลิกได้และสิ่งนี้จะไม่ทำงาน
FreewheelNat

หากเราจำเป็นต้องสลับไปมาเพื่อปิด / เปิดการใช้งาน onClickListener ของ View ในความคิดของฉันนี่เป็นทางออกที่ดีกว่าการตั้งค่า setOnClickListener (null)
Panini Luncher

1
view.setOnClickListener (null) พร้อมกับ view.setClickable (false) เป็นคำตอบที่ถูกต้องขอบคุณ !!!!
Petros Mastrantonas

12

อาจจะsetOnClickListener(null)?


1
วิธีนี้ใช้ไม่ได้กับช่องทำเครื่องหมายโดยเฉพาะและอาจไม่ทำงานกับวิดเจ็ตอื่นเช่นกัน
คริส

8

การตั้งค่าsetOnClickListener(null)เป็นความคิดที่ดีที่จะลบ listener การคลิกที่รันไทม์

และยังมีคนให้ความเห็นว่าการเรียกView.hasOnClickListeners()หลังจากนี้จะกลับมาtrue, NOเพื่อนของฉัน

นี่คือการดำเนินการ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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.