ฉันสามารถใช้รหัสเดียวกันในรูปแบบอื่นใน Android ได้หรือไม่


92

ฉันยังใหม่กับการพัฒนา Android ใช้ ID เดียวกันสำหรับรูปภาพและไฟล์ XML ที่TextViewsแตกต่างกันได้Layoutหรือไม่

เมื่อคราสจัดรายการให้ฉันโดยอัตโนมัติมันจะแสดงรายการตัวแปรโครงร่างทั้งหมดจากโครงการดังนั้นมันจะชนกันหรือไม่ จนถึงตอนนี้ฉันยังไม่สังเกตเห็นปัญหาใด ๆ ในการใช้ ID เดียวกันในรูปแบบที่แตกต่างกัน แต่ฉันกังวลในระยะยาว


โพสต์ที่เกี่ยวข้อง - สองมุมมองที่มีรหัสเดียวกัน
RBT

@Pavel คุณยังคงต้องใช้รหัสเพื่อปรับข้อ จำกัด
Sadda Hussain

คำตอบ:


96

ขอแนะนำให้คุณใช้รหัสที่แตกต่างกันสำหรับรูปแบบต่างๆ ในระยะยาวเมื่อคุณมีเลย์เอาต์จำนวนมากและด้วยเหตุนี้รหัสจำนวนมากจะมีความซับซ้อนมากในการแยกความแตกต่าง

ฉันมักจะตั้งชื่อรหัสของฉันแบบนี้: layoutName_elementId.

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

ข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบและรหัสที่สามารถพบได้ที่นี่

มีความสุขในการเขียนโค้ด


2
ปัญหาในการค้นหาคืออะไรสมมติว่าok_buttonในทุกๆกิจกรรมของคุณ? การเติมข้อความอัตโนมัติจะชัดเจนยิ่งขึ้นหากคุณรู้ว่าแชทที่คุณกำลังมองหา
Dan Chaltiel

132

คำตอบสั้น ๆ : ใช่คุณทำได้

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


15
คุณสามารถให้คำตอบที่ยาวกว่านี้ได้หรือไม่? เนื่องจาก R.id.layout_id เป็นจำนวนเต็มที่คงที่และถูกกำหนดไว้ล่วงหน้าในเวลาคอมไพล์ดังนั้น findViewById () จะไม่ทราบรูปแบบที่สูงเกินจริงในปัจจุบัน
Chloe

22
เพื่อประโยชน์ของคนอื่นที่พบคำถามนี้ฉันต้องการที่จะตอบคำขอของ Chloe รหัสจะเหมือนกันสำหรับแต่ละมุมมอง แต่จะไม่ปรากฏซ้ำสองในกิจกรรมเดียวกัน ในการเปรียบเปรยให้พิจารณาว่าจะเกิดอะไรขึ้นถ้าฉันให้กระดาษกองหนึ่งกับคุณโดยทั้งหมดมีตัวเลขจำนวนมาก กระดาษหลายแผ่นเหล่านี้มีหมายเลข 4 เขียนอยู่ คุณกำลังดูแผ่นงานแผ่นใดแผ่นหนึ่งและขอให้คุณวงกลม 4 นี่เป็นเรื่องง่าย ตอนนี้คุณดูแผ่นงานอื่นที่มี 4 อยู่ คุณสามารถค้นหาและวนเวียนได้เช่นกัน ไม่สำคัญว่าตัวเลขจะถูกกำหนดไว้ล่วงหน้า
Ted Cannelongo

6
ฉันไม่เห็นด้วยกับความคิดเห็นของ Ted คุณสามารถมีสององค์ประกอบที่มี ID เดียวกันทำงานในกิจกรรมเดียวกันได้ในเวลาเดียวกัน ฉันเพิ่งมีปัญหาในแอพฉันใช้ ViewPager สองตัวพร้อมกันในกิจกรรมหลัก เมื่อฉันพยายามดึง ViewPager ที่แสดงด้วย ID ในขณะนี้มันดึงข้อมูลอีกอันที่ทำงานอยู่เบื้องหลัง ฉันแก้ไขปัญหาโดยทำให้สอง ID ไม่ซ้ำกัน
Yoann Hercouet

9
@YoannHercouet ฉันเชื่อว่านี่เป็นเพราะทั้งคู่อยู่ในแผ่นเดียวกัน (กิจกรรม)
Naheel

22

ตามคู่มือ API สำหรับนักพัฒนา:

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

ดังนั้นคำตอบสั้น ๆ ก็คือมันไม่ได้บังคับ แต่เป็นแนวทางปฏิบัติที่ดีในการหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้นได้


1
ครั้งหนึ่งฉันเคยสร้างรหัสเดียวกันโดยบังเอิญ การยกเลิกการเปลี่ยนชื่อในภายหลังเป็นงานที่ต้องทำมากเพราะมีการปรับเปลี่ยนอินสแตนซ์ทั้งหมด ซึ่งหมายความว่าเมื่อคุณมีข้อขัดแย้งเกี่ยวกับ ID คุณจะเมา มันจะยากมากที่จะแยกทุกอย่างกลับมาอีกครั้ง
t3chb0t

@ t3chb0t ของจริง! แม้ว่าคุณจะตรวจสอบว่า Android Studio "เฉพาะในเครื่อง" เปลี่ยนชื่ออินสแตนซ์ทั้งหมด เป็นเรื่องที่น่าขันอย่างยิ่ง
John Glen

15

ไม่แนะนำเพราะถ้าในอนาคตคุณจะต้องรีแฟคview idเตอร์ Android studio จะรีแฟคเตอร์ในXMLไฟล์และคลาสทั้งหมดและคุณจะมีปัญหา

แต่ก็มีบางกรณีเช่นกันที่คุณจำเป็นต้องใช้แบบเดียวกันidเช่นหากคุณมีบทคัดย่อและนำเค้าโครงหลาย ๆ แบบมาใช้ซ้ำ

ในกรณีที่คุณมีหลายรายการที่viewsเหมือนกันid'sในโปรเจ็กต์ของคุณและคุณจำเป็นต้องปรับโครงสร้างใหม่ให้ทำด้วยตนเองอย่าใช้ฟังก์ชัน IDE ในตัวเปลี่ยนidมุมมองเป้าหมายภายในXMLเลย์เอาต์จากนั้นแก้ไขข้อผิดพลาดสีแดงภายในเลย์เอาต์

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