Різниця між "@ id /" та "@ + id /" в Android


456

Яка різниця між @id/та @+id/?

У @+id/плюсі ​​символ +вказує створити нове ім’я ресурсу та додати його до R.javaфайлу, але що робити @id/? З документації ID: при посиланні на ресурс Android IDвам не потрібен символ плюс, але потрібно додати простір імен пакетів Android, як-от так:

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

Але на зображенні нижче Eclipse не передбачає жодного виду @android:id/.

Зображення із пропозицією для @ / id та @ + / id

Це @id/і @android:id/те саме?


З андроїд-документів: (знадобилося назавжди, щоб знайти це, і я шукав непов’язану проблему) 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, то ви вказуєте новий ідентифікатор і вказуєте парсеру (або називаєте його конструктором) створити новий запис R.java, таким чином, вам доведеться включити +знак.

У іншому випадку, наприклад android:layout_below="@id/myTextView", ви посилаєтесь на вже створений ідентифікатор, тож аналізатор пов'язує це з уже створеним ідентифікатором у R.java.

Детальніше

Як ви сказали у своєму чаті, зауважте, що android:layout_below="@id/myTextView"він не розпізнає елемент з id, myTextViewякщо він записаний після елемента, у якому ви його використовуєте.


142
Щодо "Ще раз з інформацією": Ви можете визначити позицію з, android:layout_below="@+id/myTextView"а потім визначити сам елемент android:id="@id/myTextView".
каре

1
@MarcoW Це мені дуже допомогло. У мене виникли проблеми з пошуком рішення цієї проблеми (а точніше, формулювання правильного пошуку). Я здогадуюсь, це може заслуговувати на власне питання + відповідь.
Девід Мілер

Дякую! У мене була така ж проблема, і документація на цю тему не говорить дуже багато. Але очевидно: проблема, яку ми мали тут, не є частою ...
caw

7
Я завжди використовую @ + id / at 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 Мандал зазначив у своїй Ніцці (ще недооцінені) відповідь. Через це також немає негативного ефекту виконання (можливо, незмірно мале збільшення часу компіляції, хоча ^^).
Левіт

86

знак + - це ярлик для додавання ідентифікатора до вашого списку ідентифікаторів ресурсів. Інакше їх потрібно мати у такому XML-файлі

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

1
@schwiz: І як ми можемо використовувати його в нашому макеті?
Вікас Пацідар

7
уявіть, у вас є файл ресурсу, який я визначив у своїй відповіді, то у вашому макеті ви можете мати. <View android:id="@id/my_logo"/> Якщо у вас не був файл ресурсу, який я визначив вище, то вам потрібно це робити, як <View android:id="@+id/my_logo"/> зауважте: вам потрібно зробити один раз + id один раз тому якщо в іншому файлі макета ви зробили <View android: id = "+ id / my_logo" />, вам не потрібно буде включати символ "+" при наступному використанні того ж ідентифікатора в макеті.
Натан Шверман

@schwiz: Гаразд, це корисно, але куди нам потрібно поставити цей файл res/drawable/або res/layout/або res/values/і як буде називатися цей файл? Якщо у вас є якесь корисне посилання щодо цього, будь ласка, опублікуйте тут.
Вікас Пацідар

1
Ось усе, що потрібно знати про іменування конвенцій тощо для своїх ресурсів. Ви б помістили файл у res / values ​​/, а умовою є його ідентифікатор, але ви можете назвати його все, що завгодно. developer.android.com/guide/topics/resources/…
Натан Шверман

46

Іноді ви бачите посилання у файлах макета, як-от:

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

і

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

Яка різниця?

.. Я рада, що ти запитав ☺

@+id/fooозначає, що ви створюєте ідентифікатор, названий foo, у просторі імен вашої програми. Ви можете звернутися до нього за допомогою @id/foo. @android:id/fooозначає, що ви посилаєтесь на ідентифікатор, визначений у просторі імен для android.

"+" Означає створити символ, якщо він ще не існує. Він вам не потрібен (і не повинен використовувати його) при посиланні на android: символи, тому що вони вже визначені для вас платформою, і ви ніяк не можете зробити свій власний у цьому просторі імен.

Цей простір імен є простором імен фреймворку. наприклад, вам потрібно скористатися, @android:id/listтому що цей ідентифікатор, який очікує знайти рамку .. (фреймворк знає лише про ідентифікатори в просторі імен для android.)

Повністю скопійовано з цього джерела


6
Whoosh !! Заповніть CTRL + C, потім CTRL + V. радий, що ви також поклали посилання на оригінальний пост. це, до речі, ваш блог?
Аман Алам

якщо я оголосив у 1-му макеті @ + id / mybutton типу Button, тому не потрібно створювати новий екземпляр, якщо у 2-му макеті просто використовується, як @ id / mybutton. це право ?
Хірен Дабхі

39

Коротко

android:id="@+id/my_button"

Знак + id Plus повідомляє андроїд додавати або створювати новий ідентифікатор в Resources.

поки

android:layout_below="@id/my_button"

це просто допоможе віднести вже створений ідентифікатор ..


9

Знак плюс ( +) перед типом ресурсу потрібен лише тоді, коли ви вперше визначаєте ідентифікатор ресурсу. Коли ви компілюєте додаток, інструменти SDK використовують ім'я ідентифікатора, щоб створити новий ідентифікатор ресурсу у R.javaфайлі вашого проекту, який посилається на EditTextелемент. Якщо ідентифікатор ресурсу оголошено один раз таким чином, інші посилання на ідентифікатор не потребують знаку плюс. Використання знаку плюс необхідне лише при вказівці нового ідентифікатора ресурсу і не потрібно для конкретних ресурсів, таких як рядки або макети. Дивіться бічну скриньку для отримання додаткової інформації про ресурсні об'єкти.

Від: https://developer.android.com/training/basics/firstapp/building-ui.html



6

З Посібника для розробників :

android:id="@+id/my_button"

At-символ ( @) на початку рядка вказує на те, що аналізатор XML повинен розбирати та розширювати решту рядка ідентифікатора та ідентифікувати його як ресурс ідентифікатора. Символ плюс ( +) означає, що це нове ім’я ресурсу, яке потрібно створити та додати до наших ресурсів (у R.javaфайлі). Існує ряд інших ресурсів ID, які пропонують рамки Android. Посилаючись на ідентифікатор ресурсу Android, вам не потрібен символ плюс, але потрібно додати androidпростір імен пакунків, наприклад:

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


4

Є помилка з Eclipse, де іноді, якщо ви просто створили нову @+id/.. , він не буде доданий одразу до файлу R.java, навіть після чистого створення проекту. Рішення - перезапустити Eclipse.

Це, на мою думку, має бути вирішено якнайшвидше, тому що це може (і з досвіду) заплутати деяких розробників у думці, що в їхньому синтаксисі щось не так, і спробувати його налагодити, навіть якщо насправді нічого налагодити.


3
Однією з причин, чому я перейшов на Android Studio і ніколи не озирнувся назад :) (я знаю, його ще не було в той момент, коли ви написали свою відповідь)
Конрад Моравський

4

Android використовує деякі файли, що називаються ресурсами, де зберігаються значення для файлів XML.

Тепер, коли ви використовуєте @ id / для об’єкта XML, він намагається посилатися на ідентифікатор, який вже зареєстрований у файлах значень. З іншого боку, коли ви використовуєте @ + id /, він реєструє новий ідентифікатор у файлах значень, як мається на увазі символ '+'.

Сподіваюся, це допомагає :).


4

@id/ і @android:id/ не те саме.

@id/ посилання на ідентифікатор у вашій програмі, @android:id/ посилання на елемент у платформі Android.

Затьмарення - це неправильно.


@id/ referencing ID in your applicationYor говорять, що але eclise дає, Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')коли ми використовуємо її для позначення ресурсу програми. То яка різниця між @id/і @+id/? Як можна сказати, затемнення невірно?
Вікас Пацідар

1
Eclipse помиляється, якщо не показує вам пропозицію @android: id. І ви помиляєтесь, якщо використовуєте @ id / myId, не декларуючи його де-небудь за допомогою @ + id / myId. Усі @ id / xxx потрібно декларувати десь у вашій програмі, використовуючи @ + id / xxx.
Олегас

Дякуємо за ваше роз’яснення. Я думаю, що тут затемнення не є помилковим, натомість воно показує пропозицію, що базується на контексті елементів нашого компонування. Як це видно @id/лише у випадкуRelativeLayout
Вікас Пацідар

2

Різниця між @+idі @idстановить:

  • @+id використовується для створення ідентифікатора для перегляду в R.java файлі.
  • @id використовується для позначення ідентифікатора, створеного для перегляду у файлі R.java.

Ми використовуємо @+idсandroid:id="" , але що , якщо ідентифікатор не створюється , і ми маємо в виду його перед тим , як створюється (Forward реферування).

У цьому випадку ми маємо користь @+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 для Spinner @+id/spinner створюється в іншому представленні, і визначаючи спінер, ми маємо на увазі створений вище ідентифікатор.

Отже, нам потрібно створити ідентифікатор, якщо ми використовуємо представлення до того, як подання буде створено.


1

Різниця між “@+id/”і“@id/” Android в ньому

Перший використовується для створення IDпевного компонента ui, а другий використовується для позначення конкретного компонента


1

Якщо елемент виду виконує ту ж операцію, ви можете використовувати @+idдля кожного запису в будь-якому макеті , тому що під час компіляції кілька файл створює тільки одне перерахування. Наприклад, якщо у мене є кнопка збереження на кожній сторінці, яка виконує ту саму операцію, я використовую в кожному макеті. Файл R.java має лише один запис для збереження кнопки.@+id/fooR.javaandroid:id="@+id/button_save"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.