ความแตกต่างระหว่าง“ @ id /” และ“ @ + id /” ใน Android


456

ความแตกต่างระหว่าง@id/และ@+id/คืออะไร?

ใน@+id/เครื่องหมายบวก+สั่งให้สร้างชื่อทรัพยากรใหม่และเพิ่มเข้าไปในR.javaไฟล์ แต่สิ่งที่เกี่ยวกับ@id/? จากเอกสารของID: เมื่ออ้างอิงทรัพยากร Android IDคุณไม่จำเป็นต้องมีเครื่องหมายบวก แต่จะต้องเพิ่มเนมสเปซของ Android package เช่น:

android:id="@android:id/list"

@android:id/แต่ในภาพด้านล่างคราสไม่แนะนำชนิดของใด ๆ

ภาพแสดงคำแนะนำสำหรับ @ / id และ @ + / id

มี@id/และ@android:id/เดียวกันได้หรือไม่


จาก android docs: (ใช้เวลาตลอดไปในการค้นหาสิ่งนี้และฉันค้นหาปัญหาที่ไม่เกี่ยวข้องกัน) developer.android.com/guide/topics/resources/…
Juan Bonfante

คำตอบ:


351

คุณอ้างถึงAndroid resourcesซึ่งได้กำหนดไว้แล้วในระบบ Android โดย@android:id/..ที่ในขณะที่เข้าถึงทรัพยากรที่คุณได้กำหนด / สร้างในโครงการของคุณคุณจะใช้@id/..

ข้อมูลเพิ่มเติม

ตามคำชี้แจงของคุณในการแชทคุณบอกว่าคุณมีปัญหาเช่นนี้:

ถ้าเราใช้android:id="@id/layout_item_id"มันไม่ทำงาน @+id/ทำงานแทนดังนั้นความแตกต่างที่นี่คืออะไร และนั่นคือคำถามเดิมของฉัน

มันขึ้นอยู่กับบริบทเมื่อคุณใช้แอตทริบิวต์ XML ของandroid:idจากนั้นคุณระบุรหัสใหม่และกำลังสั่ง parser (หรือเรียกว่าตัวสร้าง) เพื่อสร้างรายการใหม่R.javaดังนั้นคุณต้อง รวมถึง+ป้าย

ในขณะที่ในกรณีอื่น ๆ เช่นandroid:layout_below="@id/myTextView"คุณจะหมายถึงรหัสที่ได้รับการสร้างขึ้นแล้วจึงแยกวิเคราะห์เชื่อมโยงนี้เป็น ID R.javaที่สร้างไว้แล้วใน

ข้อมูลเพิ่มเติมอีกครั้ง

ดังที่คุณได้กล่าวไว้ในการแชทโปรดทราบว่าandroid:layout_below="@id/myTextView"จะไม่รู้จักองค์ประกอบที่มี ID myTextViewหากมีการเขียนหลังจากองค์ประกอบที่คุณใช้อยู่


142
เกี่ยวกับ "ข้อมูลเพิ่มเติมอีก": คุณสามารถกำหนดตำแหน่งด้วยแล้วกำหนดองค์ประกอบตัวเองด้วยandroid:layout_below="@+id/myTextView" android:id="@id/myTextView"
caw

1
@MarcoW ที่ช่วยฉันอย่างมาก ฉันมีปัญหาในการค้นหาวิธีแก้ไขปัญหานี้ (หรือค่อนข้างกำหนดรายการค้นหาที่เหมาะสม) ฉันคิดว่ามันน่าจะสมควรได้รับคำถาม + คำตอบของมันเอง
David Miler

ขอบคุณ! ฉันมีปัญหาเดียวกันและเอกสารไม่ได้พูดอะไรมากเกี่ยวกับหัวข้อนี้ แต่ก็เห็นได้ชัด: ปัญหาที่เรามีที่นี่ไม่ได้เป็นหนึ่งบ่อย ...
กา

7
ฉันมักใช้ @ + id / ที่ android: id และ android: layout_below นั่นเป็นปัญหาหรือไม่?
melanke

4
@melanke: ใส่+ลงไปlayout_belowเช่นเดียวกับandroid:idเป็นเรื่องที่ดีจริงๆตั้งแต่The '+' means to create the symbol if it doesn't already existเป็น Tanmay Mandal กล่าวถึงในคำตอบที่ดีของเขา (ยัง underrated) ด้วยเหตุนี้จึงไม่มีเอฟเฟกต์รันไทม์เชิงลบ (อาจเพิ่มขึ้นเล็กน้อยในระยะเวลาการคอมไพล์แม้ว่า ^^)
Levite

86

เครื่องหมาย + เป็นทางลัดในการเพิ่ม id ลงในรายการรหัสทรัพยากรของคุณ มิฉะนั้นคุณต้องมีไฟล์เหล่านี้ในไฟล์ xml เช่นนี้

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>

1
@schwiz: และวิธีการที่เราสามารถใช้ในรูปแบบของเราได้อย่างไร
Vikas Patidar

7
จินตนาการว่าคุณมีไฟล์ทรัพยากรที่ฉันกำหนดไว้ในคำตอบของฉันจากนั้นในโครงร่างของคุณคุณสามารถมี<View android:id="@id/my_logo"/> หากคุณไม่ได้มีไฟล์ทรัพยากรที่ฉันกำหนดไว้ข้างต้นแล้วคุณจะต้องทำเช่น<View android:id="@+id/my_logo"/> หมายเหตุ: คุณจะต้องทำ + id เพียงครั้งเดียว ดังนั้นหากอยู่ในไฟล์เลย์เอาต์อื่นคุณได้ <ดู Android: id = "+ id / my_logo" /> คุณไม่จำเป็นต้องใส่อักขระ '+' ในครั้งต่อไปที่คุณใช้ id เดียวกันในเลย์เอาต์
Nathan Schwermann

@schwiz: โอเคที่มีประโยชน์ แต่ที่เราจะต้องใส่แฟ้มที่res/drawable/หรือres/layout/หรือres/values/และสิ่งที่จะเป็นชื่อของไฟล์ว่า? หากคุณมีลิงค์ที่มีประโยชน์เกี่ยวกับเรื่องนี้กรุณาโพสต์ที่นี่
Vikas Patidar

1
นี่คือทุกสิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับการตั้งชื่อการประชุม ฯลฯ สำหรับทรัพยากรของคุณ คุณจะวางไฟล์ใน res / values ​​/ และการประชุมคือการตั้งชื่อรหัส แต่คุณสามารถเรียกมันว่าสิ่งที่คุณต้องการ developer.android.com/guide/topics/resources/…
Nathan Schwermann

46

บางครั้งคุณเห็นการอ้างอิงในไฟล์เลย์เอาต์ของคุณเช่น:

<listview id="@+id/android:list">

และ

<listview id="@android:id/list">

ความแตกต่างคืออะไร?

.. ฉันดีใจที่คุณถาม☺

@+id/fooหมายความว่าคุณกำลังสร้าง id ชื่อ foo ในเนมสเปซของแอปพลิเคชันของคุณ @id/fooคุณสามารถดูได้โดยใช้ @android:id/fooหมายความว่าคุณกำลังอ้างถึงรหัสที่กำหนดใน android namespace

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

เนมสเปซนี้เป็นเนมสเปซของกรอบงาน ตัวอย่างเช่นคุณต้องใช้@android:id/listเพราะนี่เป็นเฟรมเวิร์กที่คาดว่าจะพบ .. (เฟรมเวิร์กรู้เฉพาะเกี่ยวกับรหัสใน android namespace)

คัดลอกมาจากแหล่งนี้อย่างสมบูรณ์


6
หวือ !! ทำ CTRL + C ให้เสร็จสิ้นจากนั้นกด CTRL + V ดีใจที่คุณอ้างอิงถึงโพสต์ต้นฉบับด้วย มันเป็นบล็อกของคุณหรือไม่
Aman Alam

ถ้าฉันประกาศในรูปแบบที่ 1 @ + id / mybutton ของปุ่มชนิดดังนั้นไม่จำเป็นต้องสร้างอินสแตนซ์ใหม่ของถ้าในรูปแบบที่ 2 เพิ่งใช้เช่น @ id / mybutton ถูกไหม
Hiren Dabhi

39

ในระยะสั้น

android:id="@+id/my_button"

+ id Plus sign บอกให้ android เพิ่มหรือสร้าง id ใหม่ใน Resources

ในขณะที่

android:layout_below="@id/my_button"

มันแค่ช่วยอ้างอิง id ที่สร้างขึ้นแล้ว ..


9

เครื่องหมายบวก ( +) ก่อนประเภททรัพยากรจะต้องใช้เฉพาะเมื่อคุณกำหนดรหัสทรัพยากรเป็นครั้งแรก เมื่อคุณรวบรวมแอพเครื่องมือ SDK ใช้ชื่อ ID เพื่อสร้าง ID ทรัพยากรใหม่ในR.javaไฟล์ของโครงการที่อ้างถึงEditTextองค์ประกอบ ด้วย ID ทรัพยากรที่ประกาศหนึ่งครั้งด้วยวิธีนี้การอ้างอิงอื่น ๆ ไปยัง ID ไม่จำเป็นต้องมีเครื่องหมายบวก การใช้เครื่องหมายบวกเป็นสิ่งจำเป็นเฉพาะเมื่อระบุ ID ทรัพยากรใหม่และไม่จำเป็นสำหรับทรัพยากรรูปธรรมเช่นสตริงหรือเลย์เอาต์ ดูกล่องด้านข้างสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวัตถุทรัพยากร

จาก: https://developer.android.com/training/basics/firstapp/building-ui.html



6

จากคู่มือผู้พัฒนา :

android:id="@+id/my_button"

at-symbol ( @) ที่จุดเริ่มต้นของสตริงบ่งชี้ว่าตัวแยกวิเคราะห์ XML ควรแยกวิเคราะห์และขยายส่วนที่เหลือของสตริง ID และระบุว่าเป็นทรัพยากร ID เครื่องหมายบวก ( +) หมายความว่านี่คือชื่อทรัพยากรใหม่ที่ต้องสร้างและเพิ่มลงในทรัพยากรของเรา (ในR.javaไฟล์) มีทรัพยากร ID อื่น ๆ จำนวนหนึ่งที่เสนอโดยกรอบงาน Android เมื่ออ้างอิง ID ทรัพยากร Android คุณไม่จำเป็นต้องมีเครื่องหมายบวก แต่ต้องเพิ่มandroidเนมสเปซแพ็คเกจเช่น:

android:id="@android:id/empty"


4

มีข้อผิดพลาดกับ Eclipse ซึ่งบางครั้งถ้าคุณเพิ่งสร้างขึ้นใหม่@+id/..มันจะไม่ถูกเพิ่มทันทีไปยังไฟล์ R.java แม้หลังจากทำความสะอาดโครงการแล้วก็ตาม ทางออกคือรีสตาร์ท Eclipse

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


3
หนึ่งในเหตุผลที่ฉันเปลี่ยนมาใช้ Android Studio และไม่เคยหันกลับมามอง :) (ฉันรู้ว่ามันยังไม่ถึงเวลาที่คุณเขียนคำตอบของคุณ)
Konrad Morawski

4

Android ใช้ไฟล์บางไฟล์ที่เรียกว่าทรัพยากรที่เก็บค่าสำหรับไฟล์ XML

ตอนนี้เมื่อคุณใช้ @ id / สำหรับวัตถุ XML มันพยายามอ้างถึง id ที่ลงทะเบียนแล้วในไฟล์ค่า ในทางกลับกันเมื่อคุณใช้ @ + id / มันจะลงทะเบียนรหัสใหม่ในไฟล์ค่าตามที่ระบุโดยสัญลักษณ์ '+'

หวังว่านี่จะช่วยได้ :)


4

@id/และ@android:id/ไม่เหมือนกัน

@id/ID อ้างอิงในแอปพลิเคชันของคุณ@android:id/อ้างอิงถึงรายการในแพลตฟอร์ม Android

Eclipse ผิด


Yor กำลังบอกว่า@id/ referencing ID in your applicationแต่ eclise ให้Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')เมื่อเราใช้มันเพื่ออ้างอิงทรัพยากรของแอปพลิเคชัน ดังนั้นความแตกต่างระหว่าง@id/และ@+id/คืออะไร คุณพูดได้อย่างไรว่า eclipse ผิด?
Vikas Patidar

1
Eclipse ไม่ถูกต้องในกรณีที่ไม่แสดงคำแนะนำ @android: id ให้คุณ และคุณผิดถ้าคุณใช้ @ id / myId โดยไม่ต้องประกาศด้วย @ + id / myId ที่ไหนสักแห่ง ต้องประกาศ @ id / xxx ทั้งหมดในแอปพลิเคชันของคุณโดยใช้ @ + id / xxx
Olegas

ขอบคุณสำหรับคำชี้แจงของคุณ ฉันคิดว่าที่นี่คราสไม่ผิดแทนที่จะแสดงข้อเสนอแนะตามบริบทขององค์ประกอบเค้าโครงของเรา ตามที่แสดง@id/เฉพาะในกรณีของRelativeLayout
Vikas Patidar

2

ความแตกต่างระหว่าง@+idและ@idคือ:

  • @+idถูกใช้เพื่อสร้างรหัสสำหรับมุมมองในR.javaไฟล์
  • @id ใช้เพื่ออ้างถึง id ที่สร้างขึ้นสำหรับมุมมองในไฟล์ R.java

เราใช้@+idกับandroid:id=""แต่จะเกิดอะไรขึ้นถ้ารหัสไม่ได้ถูกสร้างขึ้นและเรากำลังอ้างอิงก่อนที่จะสร้าง (การอ้างอิงไปข้างหน้า)

ในกรณีนี้เราใช้@+idเพื่อสร้าง id และในขณะที่กำหนดมุมมองที่เราต้องอ้างอิง

โปรดอ้างอิงรหัสด้านล่าง:

<RelativeLayout>

     <TextView
        android:id="@+id/dates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/spinner" />

   <Spinner
     android:id="@id/spinner"
     android:layout_width="96dp"
     android:layout_height="wrap_content"
     android:layout_below="@id/dates"
     android:layout_alignParentRight="true" />

</RelativeLayout>

ในโค้ดด้านบน id สำหรับสปินเนอร์@+id/spinnerถูกสร้างขึ้นในมุมมองอื่นและในขณะที่กำหนดสปินเนอร์เราจะอ้างอิง ID ที่สร้างขึ้นด้านบน

ดังนั้นเราต้องสร้างรหัสถ้าเราใช้มุมมองก่อนที่จะสร้างมุมมอง


1

ความแตกต่างระหว่าง“@+id/”และ“@id/”ใน Android

อันแรกใช้สำหรับการสร้างIDองค์ประกอบ UI เฉพาะและอีกอันหนึ่งใช้สำหรับอ้างอิงองค์ประกอบเฉพาะ


1

หากรายการมุมมองการดำเนินการดำเนินการเดียวกันคุณสามารถใช้@+idสำหรับแต่ละรายการในรูปแบบใด ๆ เพราะในระหว่างการรวบรวมของหลายไฟล์เพียง แต่จะสร้างการแจงนับหนึ่ง ตัวอย่างเช่นถ้าฉันมีปุ่มบันทึกในแต่ละหน้าที่ทำการดำเนินการเดียวกันฉันจะใช้ในแต่ละเค้าโครง ไฟล์ R.java มีเพียงหนึ่งรายการสำหรับ button_save@+id/fooR.javaandroid:id="@+id/button_save"

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