Android: เหตุใดการคลิกแบบยาวจึงทำให้เกิดการคลิกตามปกติ


126

ฉันมี ListView พร้อมผู้ฟังสำหรับการคลิกที่ยาวนานและการคลิกปกติ

ทำไมเมื่อฉันกดรายการนาน ๆ เหตุการณ์การคลิกปกติจึงถูกเรียกด้วย?

ฉันจำเป็นต้องมีฟังก์ชั่นสองอย่างแยกกันสำหรับการคลิกที่ต่างกัน

คำตอบ:


284

จากผู้ฟังเหตุการณ์ :

onLongClick () - ส่งคืนบูลีนเพื่อระบุว่าคุณได้ใช้งานเหตุการณ์หรือไม่และไม่ควรดำเนินการต่อไป นั่นคือกลับจริงเพื่อระบุว่าคุณได้จัดการเหตุการณ์แล้วและมันควรจะหยุดเพียงแค่นี้ ส่งคืนเท็จหากคุณไม่ได้จัดการและ / หรือเหตุการณ์นั้นควรส่งต่อไปยังผู้ฟังที่คลิกอื่น ๆ

คุณกลับtrueจากของคุณonLongClick()และยังคงได้รับเหตุการณ์คลิกตามปกติหรือไม่

แก้ไขเพิ่ม : สำหรับ ListView OnItemLongClickListenerคุณอาจจะใช้ ที่onItemLongClick()นั่นใช้ค่าส่งคืนบูลีนที่คล้ายกันเพื่อระบุว่าใช้เหตุการณ์หรือไม่


1
สำหรับการตั้งค่าตัวเลือกที่คุณจะต้องแทนที่ฟังก์ชันmyListView.setOnItemLongClickListener(this); public boolean onItemLongClick(...)ที่นี่คุณเพียงแค่ต้องreturn trueระบุว่า LongClick ถูกเปิดใช้งานและจะยกเลิกทริกเกอร์ในการคลิกปกติ หากคุณส่งคืนเท็จมันจะทำให้เกิดการคลิกปกติเช่นกัน
Brandon

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

@erichamion ฉันลองใช้วิธีแก้ปัญหาของคุณสำหรับปัญหาที่คล้ายกันโดยไม่มีโชค ฉันขอขอบคุณสำหรับข้อมูลเชิงลึกหรือความคิดที่คุณสามารถให้ได้ที่นี่: stackoverflow.com/questions/47783631/…
AJW

50

ตอบกลับคำตอบในแง่ที่ง่ายกว่า:

ได้รับ:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return trueหมายความว่าเหตุการณ์นั้นหมดไป มีการจัดการ จะไม่มีการแจ้งเตือนเหตุการณ์การคลิกอื่น ๆ
  • return falseหมายถึงไม่ได้ใช้งานกิจกรรม กิจกรรมการคลิกอื่น ๆ จะยังคงได้รับการแจ้งเตือน

ดังนั้นหากคุณไม่ต้องการonClickถูกทริกเกอร์หลังจากเหตุการณ์onLongClickนั้นคุณควรreturn trueออกจากonLongClickเหตุการณ์


2
คำตอบที่สมบูรณ์แบบสุด ๆ หากเราใส่ค่าที่แท้จริงมันจะจัดการกับการคลิกแบบยาวเท่านั้นหากเราใส่เท็จจากนั้นทั้งเหตุการณ์การคลิกและการกดแบบยาวจะเกิดขึ้นพร้อมกัน
Pir Fahim Shah

คำตอบที่ยอดเยี่ยม
Sam Chen

20

ตรวจสอบให้แน่ใจว่าคุณได้ลบล้างวิธีการOnClickListenerของคุณ onClickตรวจสอบให้แน่ใจว่าคุณได้ลบล้างวิธีการOnLongClickListenerของคุณ onLongClickและตรวจสอบให้แน่ใจว่าonLongClickวิธีการของคุณส่งคืนtrueเนื่องจากจะใช้ไฟล์onClick.


ฉันเพิ่ม true ในเมธอด onLongClick ของฉัน แต่ยังมีปัญหาว่าเมธอด onClick ของฉันไม่เริ่มทำงานหลังจากนั้น ฉันจะขอบคุณความคิดหรือความคิดเกี่ยวกับวิธีการแก้ปัญหาอยู่ที่นี่: stackoverflow.com/questions/47783631/…
AJW

0

คุณสามารถใช้setOnLongClickListenerการสร้างอินสแตนซ์ของnew View.OnClickListener()หรือnew View.OnLongClickListener()หากคุณสร้างการคลิกแบบยาวและใช้ OnclickListener ตามปกติคุณจะได้รับข้อผิดพลาดนี้จากการเปิดใช้งานวิธีการคลิกเพียงครั้งเดียว คุณควรใช้new View.OnLongClickListener()เพื่อจับคลิกยาว ๆ เท่านั้น

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