เป็นวิธีที่เหมาะสมในการใช้อินเทอร์เฟซ OnClickListener สำหรับปุ่มมากมายได้อย่างไร


10

กิจกรรม Android ของฉันมีหลายปุ่มที่ทุกคนต้องมี OnClickListener ฉันเห็นวิธีการต่าง ๆ มากมายเช่น ::

  • การนำอินเตอร์เฟสไปใช้ในคลาสกิจกรรม
  • การสร้างคลาสแยกต่างหากที่ใช้อินเทอร์เฟซ
  • การกำหนดคลาสภายในที่ไม่ระบุชื่อสำหรับแต่ละปุ่ม

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

คำตอบ:


6

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

คลาสกิจกรรมใช้อินเทอร์เฟซ :
นี่เป็นตัวเลือกที่ดีเมื่อคุณมีงานประเภทเดียวที่จะดำเนินการเมื่อผู้ฟังนี้ถูกเรียกใช้ ตัวอย่างนี้จะเป็นรูปแบบที่เรียบง่ายที่มีจำนวนฟิลด์และปุ่มบันทึก ฉันไม่ต้องการให้ผู้ฟังเหตุการณ์ตรวจสอบแหล่งที่มาของเหตุการณ์เพื่อตัดสินใจว่าต้องทำอะไรจริง ๆ ฉันรู้ว่าบางคนอาจบอกว่านี่เป็นสิ่งที่มีสไตล์ แต่ฉันเชื่อว่าหากไม่ต้องการให้ผู้ฟังทำการตรวจสอบนี้จะทำให้โค้ดติดตามได้ง่ายขึ้นเนื่องจากคุณจะรู้ว่าสิ่งที่ถูกเรียกสำหรับแต่ละเหตุการณ์

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

การใช้งานนี้มีประโยชน์เพิ่มเติมที่คุณสามารถใช้หากคุณสนใจ ประโยชน์คือช่วยป้องกันไม่ให้คลาสอื่นเรียกเหตุการณ์ภายในคลาสกิจกรรมของคุณ เนื่องจากวิธีการอินเทอร์เฟซต้องเป็นสาธารณะทุกคนที่มีการอ้างอิงถึงคลาสสามารถดำเนินการเหตุการณ์ได้ ถ้าคุณต้องการการควบคุมอย่างละเอียดว่าใครสามารถทำอะไรในแอปพลิเคชันได้คลาสที่แยกต่างหากจะป้องกันไม่ให้ใครก็ตามที่มีการอ้างอิงถึงกิจกรรมเพื่อทริกเกอร์แบบฟอร์มของคุณเพื่อเคลียร์หรือบันทึก (หรืออาจทำลายรหัสถ้าผู้ฟัง ไม่จัดการอินพุตที่ไม่ดี)

คลาสภายในที่ไม่ระบุชื่อใช้อินเตอร์เฟส :
นี่เป็นเพียงวิธีเฉพาะในการสร้างตัวเลือกที่สองของการใช้คลาสที่แตกต่างเป็นการใช้งาน ตัวเลือกนี้สามารถ จำกัด ผู้ที่มีสิทธิ์เข้าถึงในการทริกเกอร์เหตุการณ์ได้อีกเนื่องจากไม่มีใครสามารถสร้างตัวอย่างของคลาสได้ อย่างไรก็ตามฉันคิดว่าปัจจัยที่สำคัญกว่าระหว่างตัวเลือกสองตัวคือจำนวนงานที่ทำ การล้างเขตข้อมูลข้อความสองสามเป็นการดำเนินการที่ง่ายและตรงไปตรงมา อย่างไรก็ตามกระบวนการของการบันทึกสำหรับสามารถเกี่ยวข้องกับจำนวนของงานคือคุณกำลังตรวจสอบการป้อนข้อมูล (ซึ่งคุณควรจะทำ) เขียนไปยังฐานข้อมูลเพื่อเก็บค่าและเรียกการกระทำการบันทึกโพสต์ ในกรณีนี้การสร้างคลาสแยกต่างหากด้วยไฟล์ของตัวเองจะทำให้การแบ่งชัดเจนระหว่างแบบฟอร์มอินพุตและการประมวลผลข้อมูล ในทางกลับกันจะเก็บรหัสฟอร์มแทนไฟล์ที่มีขนาดใหญ่กว่าโดยมีคลาสภายในหลายตัวซ้อนอยู่ภายใน


ว้าวขอบคุณสำหรับคำตอบของคุณ ในแง่ของค่าใช้จ่ายมันมีค่าใช้จ่ายมากขึ้นในการสร้างคลาสผู้ฟังหลายคนหรือไม่
slayton

@slayton: จะมีค่าใช้จ่ายเสมอไม่ว่าคุณจะทำอะไร คำถามควรจะเป็น "ความแตกต่างมีความสำคัญกับคุณหรือไม่" มีน้ำหนักในการสร้างวัตถุมากขึ้น แต่เวลาดำเนินการจะนานขึ้นหากผู้ฟังของคุณต้องผ่านรายการแหล่งข้อมูลเพื่อตัดสินใจว่าจะทำอะไรจริง ๆ หากการใช้หน่วยความจำและประสิทธิภาพเป็นสิ่งสำคัญสำหรับคุณคุณควรกำหนดรหัสและตัดสินใจว่าอะไรจะดีที่สุดตามความต้องการของคุณ อย่างไรก็ตามฉันสงสัยว่านี่จะเป็นคอขวดของรหัสของคุณ จนกว่าจะแสดงเป็นอย่างอื่นให้ทำการตัดสินใจของคุณเพื่อให้รหัสชัดเจนขึ้นและเป็นระเบียบ
unholysampler

3

วิธีที่สี่คือการตั้งค่าแอตทริบิวต์ onClick ในรูปแบบ:

<Button android:onClick="clickHandlerForButtonX" />

ซึ่งมีวิธีการที่สอดคล้องกันนี้ในกิจกรรม:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

น่าสนใจฉันไม่รู้ว่าคุณสามารถทำได้ แม้ว่านี่จะเป็นกลไกเฉพาะของ Android ในการจัดการกับการคลิกปุ่ม
slayton

ฉันมักจะไปกับ "ชั้นกิจกรรมที่ใช้อินเทอร์เฟซ" แม้ว่า - วิธีนั้นคุณมีทุกอย่างที่เกี่ยวข้องกับการคลิกในที่เดียวกัน
orjan

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