Perbedaan antara "@ id /" dan "@ + id /" di Android

456

Apa perbedaan antara @id/dan @+id/?

Dalam @+id/simbol plus +menginstruksikan untuk membuat nama sumber daya baru dan menambahkan R.javafile tetapi bagaimana @id/? Dari dokumentasi ID: ketika mereferensikan sumber daya Android ID, Anda tidak perlu simbol plus, tetapi harus menambahkan namespace paket android, seperti:

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

Namun pada gambar di bawah ini Eclipse tidak menyarankan apa pun @android:id/.

Gambar menampilkan saran untuk @ / id dan @ + / id

Apakah @id/dan @android:id/sama?

Vikas Patidar
sumber
Dari android docs: (butuh selamanya untuk menemukan ini, dan saya mencari masalah yang tidak terkait) developer.android.com/guide/topics/resources/…
Juan Bonfante

Jawaban:

351

Anda merujuk Android resources, yang sudah didefinisikan dalam sistem Android, dengan @android:id/..sementara untuk mengakses sumber daya yang telah Anda tetapkan / buat dalam proyek Anda, Anda menggunakan@id/..

Info lebih lanjut

Sesuai klarifikasi Anda dalam obrolan, Anda mengatakan Anda memiliki masalah seperti ini:

Jika kita menggunakannya android:id="@id/layout_item_id"tidak berfungsi. Alih-alih @+id/berfungsi jadi apa bedanya di sini? Dan itu adalah pertanyaan awal saya.

Yah, itu tergantung pada konteksnya, ketika Anda menggunakan atribut XML android:id, maka Anda menentukan id baru, dan menginstruksikan pengurai (atau menyebutnya pembangun) untuk membuat entri baru R.java, sehingga Anda harus termasuk sebuah +tanda.

Sementara dalam kasus lain, seperti android:layout_below="@id/myTextView", Anda merujuk ke id yang telah dibuat, jadi parser menautkan ini ke id yang sudah dibuat di R.java.

Info Lebih Lanjut Lagi

Seperti yang Anda katakan dalam obrolan Anda, perhatikan bahwa android:layout_below="@id/myTextView"tidak akan mengenali elemen dengan id myTextViewjika itu ditulis setelah elemen tempat Anda menggunakannya.

Aman Alam
sumber
142
Mengenai "Info Lagi Lagi": Anda dapat menentukan posisi dengan android:layout_below="@+id/myTextView"dan MAKA menentukan elemen itu sendiri dengan android:id="@id/myTextView".
gak
1
@ MarscoW Itu sangat membantu saya. Saya mengalami kesulitan menemukan solusi untuk masalah ini (atau lebih tepatnya merumuskan entri pencarian yang tepat). Saya kira itu mungkin layak pertanyaan + jawaban sendiri.
David Miler
Terima kasih! Saya memiliki masalah yang sama, dan dokumentasinya tidak banyak berbicara tentang topik ini. Tapi sudah jelas: Masalah yang kita miliki di sini bukanlah masalah yang sering ...
caw
7
Saya selalu menggunakan @ + id / di android: id dan android: layout_below, apakah itu masalah?
melanke
4
@melanke: Menempatkan ke +dalam layout_belowdan android:idbenar-benar baik-baik saja, karena The '+' means to create the symbol if it doesn't already existseperti yang disebutkan Tanmay Mandal dalam jawabannya yang bagus (belum diremehkan). Karena itu, tidak ada efek runtime negatif (mungkin peningkatan waktu kompilasi yang tidak terukur ^^).
Levite
86

tanda + adalah jalan pintas untuk menambahkan id ke daftar id sumber daya Anda. Kalau tidak, Anda perlu memilikinya dalam file xml seperti ini

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>
Nathan Schwermann
sumber
1
@ schwiz: Dan bagaimana kita menggunakannya dalam tata letak kita?
Vikas Patidar
7
bayangkan Anda memiliki file sumber daya yang saya tentukan dalam jawaban saya, maka dalam tata letak Anda, Anda dapat memiliki. <View android:id="@id/my_logo"/> Jika Anda tidak memiliki file sumber daya yang saya tetapkan di atas maka Anda perlu melakukannya seperti <View android:id="@+id/my_logo"/> catatan: Anda hanya perlu melakukan + id satu kali jadi jika dalam file tata letak lain yang Anda lakukan <View android: id = "+ id / my_logo" /> Anda tidak perlu memasukkan karakter '+' saat berikutnya Anda menggunakan id yang sama dalam tata letak.
Nathan Schwermann
@ schwiz: Oke itu berguna tapi di mana kita harus meletakkan file itu res/drawable/atau res/layout/atau res/values/dan apa yang akan menjadi nama file itu? Jika Anda memiliki tautan yang bermanfaat mengenai hal ini maka silakan posting di sini.
Vikas Patidar
1
Ini semua yang perlu Anda ketahui tentang konvensi penamaan, dll untuk sumber daya Anda. Anda akan meletakkan file dalam res / nilai / dan konvensi adalah untuk menamai itu id tetapi Anda dapat menyebutnya apa pun yang Anda inginkan. developer.android.com/guide/topics/resources/…
Nathan Schwermann
46

Terkadang Anda melihat referensi di file tata letak Anda seperti:

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

dan

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

Apa bedanya?

.. Saya senang Anda bertanya ☺

@+id/fooberarti Anda membuat id bernama foo di namespace aplikasi Anda. Anda dapat merujuknya menggunakan @id/foo. @android:id/fooberarti Anda merujuk ke id yang ditentukan di namespace android.

'+' Berarti membuat simbol jika belum ada. Anda tidak memerlukannya (dan tidak boleh menggunakannya) ketika mereferensikan simbol android: karena sudah ditentukan untuk Anda oleh platform dan Anda tidak dapat membuatnya sendiri di namespace itu.

Namespace ini adalah namespace dari framework. misalnya, Anda perlu menggunakan @android:id/listkarena ini id kerangka kerja yang diharapkan untuk menemukan .. (kerangka kerja hanya tahu tentang id di namespace android.)

Disalin sepenuhnya dari sumber ini

Tanmay Mandal
sumber
6
Suara mendesing!! Selesaikan CTRL + C lalu CTRL + V. senang Anda menaruh referensi ke posting asli juga. Ngomong-ngomong, apakah blog Anda?
Aman Alam
jika saya telah mendeklarasikan dalam 1st layout @ + id / mybutton dari type Button, jadi tidak perlu membuat instance baru jika dalam 2nd layout hanya digunakan seperti @ id / mybutton. Apakah tepat ?
Hiren Dabhi
39

Pendeknya

android:id="@+id/my_button"

Tanda + id Plus memberi tahu android untuk menambahkan atau membuat id baru di Sumber Daya.

sementara

android:layout_below="@id/my_button"

itu hanya membantu untuk merujuk id yang sudah dihasilkan ..

Zar E Ahmer
sumber
9

Tanda tambah ( +) sebelum jenis sumber hanya diperlukan saat Anda menentukan ID sumber daya untuk pertama kalinya. Saat Anda mengompilasi aplikasi, alat SDK menggunakan nama ID untuk membuat ID sumber daya baru dalam R.javafile proyek Anda yang merujuk ke EditTextelemen. Dengan ID sumber daya dinyatakan sekali dengan cara ini, referensi lain untuk ID tidak perlu tanda tambah. Menggunakan tanda plus hanya diperlukan saat menentukan ID sumber daya baru dan tidak diperlukan untuk sumber daya konkret seperti string atau tata letak. Lihat kotak sisi untuk informasi lebih lanjut tentang objek sumber daya.

Dari: https://developer.android.com/training/basics/firstapp/building-ui.html

Nguyen
sumber
6

Dari Panduan Pengembang :

android:id="@+id/my_button"

Simbol-at ( @) di awal string menunjukkan bahwa parser XML harus mem-parsing dan memperluas sisa string ID dan mengidentifikasinya sebagai sumber daya ID. Simbol plus ( +) berarti bahwa ini adalah nama sumber daya baru yang harus dibuat dan ditambahkan ke sumber daya kami (dalam R.javafile). Ada sejumlah sumber daya ID lainnya yang ditawarkan oleh kerangka kerja Android. Saat mereferensikan ID sumber daya Android, Anda tidak perlu simbol plus, tetapi harus menambahkan androidnamespace paket, seperti:

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

Jeff Axelrod
sumber
4

Ada bug dengan Eclipse di mana kadang-kadang jika Anda baru saja membuat yang baru @+id/.., itu tidak akan segera ditambahkan ke file R.java, bahkan setelah membersihkan proyek. Solusinya adalah me-restart Eclipse.

Ini saya pikir harus diselesaikan sesegera mungkin, karena mungkin (dan dari pengalaman, akan) membingungkan beberapa pengembang untuk berpikir bahwa ada sesuatu yang salah dengan sintaks mereka, dan mencoba untuk men-debug itu bahkan jika benar-benar tidak ada yang debug.

Yosephus
sumber
3
Salah satu alasan mengapa saya beralih ke Android Studio dan tidak pernah melihat ke belakang :) (Saya tahu itu belum ada pada saat Anda menulis jawaban Anda)
Konrad Morawski
4

Android menggunakan beberapa file yang disebut sumber daya tempat nilai disimpan untuk file XML.

Sekarang ketika Anda menggunakan @ id / untuk objek XML, ia mencoba merujuk ke id yang sudah terdaftar di file nilai. Di sisi lain, ketika Anda menggunakan @ + id / ia mendaftarkan id baru di file nilai sebagaimana tersirat oleh simbol '+'.

Semoga ini membantu :).

Tanuj Nayak
sumber
4

@id/dan @android:id/tidak sama.

@id/referensi ID di aplikasi Anda, @android:id/referensi item di platform Android.

Gerhana salah.

Olegas
sumber
Yor mengatakan bahwa @id/ referencing ID in your applicationTapi eclise memberi Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')ketika kita menggunakannya untuk merujuk sumber daya aplikasi. Jadi apa perbedaan antara @id/dan @+id/? Bagaimana Anda bisa mengatakan gerhana itu salah?
Vikas Patidar
1
Eclipse salah jika tidak menampilkan saran @android: id. Dan Anda salah, jika Anda menggunakan @ id / myId tanpa mendeklarasikannya dengan @ + id / myId di suatu tempat. Semua @ id / xxx harus dideklarasikan di suatu tempat di aplikasi Anda menggunakan @ + id / xxx.
Olegas
Terima kasih atas klarifikasi Anda. Saya pikir di sini gerhana tidak salah melainkan menunjukkan saran berdasarkan konteks elemen tata letak kami. Seperti yang ditunjukkan @id/hanya dalam kasusRelativeLayout
Vikas Patidar
2

Perbedaan antara @+iddan @idadalah:

  • @+iddigunakan untuk membuat id untuk tampilan dalam R.javafile.
  • @id digunakan untuk merujuk id yang dibuat untuk tampilan dalam file R.java.

Kami menggunakan @+iddengan android:id="", tetapi bagaimana jika id tidak dibuat dan kami merujuk sebelum dibuat (Forward Referencing).

Dalam hal ini, kita harus menggunakan @+iduntuk membuat id dan sementara mendefinisikan pandangan kita harus merujuknya.

Silakan merujuk kode di bawah ini:

<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>

Pada kode di atas, id untuk Spinner @+id/spinnerdibuat di tampilan lain dan saat mendefinisikan spinner, kami merujuk id yang dibuat di atas.

Jadi, kita harus membuat id jika kita menggunakan view sebelum view telah dibuat.

Penjualan Kunal
sumber
1

Perbedaan antara “@+id/”dan “@id/”di Android

Yang pertama digunakan untuk membuat IDkomponen ui tertentu dan yang lain digunakan untuk merujuk komponen tertentu

Gurpreet Singh
sumber
1

Jika pandangan item yang melakukan operasi yang sama, Anda dapat menggunakan @+iduntuk setiap entri dalam tata letak apapun karena selama kompilasi beberapa @+id/fooyang R.javaberkas hanya menciptakan satu pencacahan. Jadi misalnya, jika saya memiliki tombol simpan di setiap halaman yang melakukan operasi yang sama, saya gunakan android:id="@+id/button_save"di setiap tata letak. File R.java hanya memiliki satu entri untuk button_save.

TheChrisONeil
sumber