Разница между «@ 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/то же самое?

Викас Патидар
источник
Из документов Android: (это заняло целую вечность, и я искал не связанную с этим проблему) developer.android.com/guide/topics/resources/…
Хуан Бонфанте

Ответы:

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"элемент с идентификатором не будет распознаваться, myTextViewесли он будет записан после элемента, в котором вы его используете.

Аман Алам
источник
142
Относительно «More Info Again»: Вы можете определить позицию с помощью, android:layout_below="@+id/myTextView"а затем определить сам элемент с помощью android:id="@id/myTextView".
caw
1
@ MarcoW Это мне очень помогло. У меня были проблемы с поиском решения этой проблемы (или, скорее, формулировка правильной записи поиска). Я предполагаю, что это могло бы заслуживать вопроса + ответ самостоятельно.
Дэвид Милер
Спасибо! У меня была такая же проблема, и документация не говорит много об этой теме. Но это очевидно: проблема, с которой мы столкнулись, не частая ...
caw
7
Я всегда использую @ + id / на android: id и android: layout_below, это проблема?
Меланке
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 ​​/, и принято называть его id, но вы можете называть его как хотите. 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.)

Полностью скопировано из этого источника

Tanmay Mandal
источник
6
Свист !! Завершите CTRL + C, затем CTRL + V. рад что вы поставили ссылку на оригинальный пост тоже. Кстати, это твой блог?
Аман Алам
если я объявил в первом макете @ + id / mybutton типа Button, то нет необходимости создавать новый экземпляр if во втором макете, просто используется как @ id / mybutton. это правильно ?
Хирен Дабхи
39

Короче говоря

android:id="@+id/my_button"

+ id знак плюс говорит Android добавить или создать новый идентификатор в ресурсах.

пока

android:layout_below="@id/my_button"

это просто поможет ссылаться на уже сгенерированный идентификатор ..

Zar E Ahmer
источник
9

Знак плюс ( +) перед типом ресурса необходим только при первом определении идентификатора ресурса. Когда вы компилируете приложение, инструменты SDK используют имя идентификатора для создания нового идентификатора ресурса в R.javaфайле вашего проекта, который ссылается на EditTextэлемент. Если идентификатор ресурса объявлен один раз таким образом, другие ссылки на идентификатор не нуждаются в знаке плюса. Использование знака плюс необходимо только при указании нового идентификатора ресурса и не требуется для конкретных ресурсов, таких как строки или макеты. Смотрите врезку для получения дополнительной информации об объектах ресурсов.

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

Нгуен
источник
6

Из Руководства разработчика :

android:id="@+id/my_button"

At-symbol ( @) в начале строки указывает, что синтаксический анализатор 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.

Затмение не так.

Olegas
источник
Вы говорите, что @id/ referencing ID in your applicationEclise дает, Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')когда мы используем его для ссылки на ресурс приложения. Так в чем разница между @id/и @+id/? Как вы могли бы сказать, что затмение неправильно?
Викас Патидар
1
Затмение неверно в случае не показа вам предложения @android: id. И вы ошибаетесь, если вы используете @ id / myId, не объявляя его где-то @ + id / myId. Все @ id / xxx должны быть объявлены где-то в вашем приложении, используя @ + id / xxx.
Олегас
Спасибо за ваше разъяснение. Я думаю, что здесь затмение не является неправильным, вместо этого оно показывает предложение, основанное на контексте наших элементов макета. Как показывает @id/только в случаеRelativeLayout
Викас Патидар
2

Разница между @+idи @idесть:

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

Мы используем @+idс android: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>

В приведенном выше коде идентификатор для Spinner @+id/spinnerсоздается в другом представлении, и при определении счетчика мы ссылаемся на идентификатор, созданный выше.

Таким образом, мы должны создать идентификатор, если мы используем представление до того, как представление было создано.

Кунал Сэйл
источник
1

Разница между “@+id/”и “@id/”в Android

Первый используется для создания IDконкретного компонента пользовательского интерфейса, а другой - для ссылки на конкретный компонент.

Гурприт Сингх
источник
1

Если элемент представления выполняет ту же операцию, вы можете использовать @+id для каждой записи в любом макете , потому что во время компиляции несколько файл создает только одно перечисления. Так, например, если у меня есть кнопка сохранения на каждой странице, которая выполняет одну и ту же операцию, я использую ее в каждом макете. Файл R.java содержит только одну запись для button_save.@+id/fooR.javaandroid:id="@+id/button_save"

TheChrisONeil
источник