Разница между "@ id /" и "@ + id /" в Android - PullRequest
430 голосов
/ 17 февраля 2011

Какая разница между @id/ и @+id/?

В @+id/ знак плюс + дает указание создать новыйимя ресурса и добавьте его в файл R.java, но как насчет @id/?Из документации ID: при ссылке на ресурс Android ID вам не нужен символ плюса, но вы должны добавить пространство имен пакета Android, например:

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

Но на изображении ниже Eclipse не предлагает никаких @android:id/.

Image showing the suggestion for the @/id and @+/id

Являются ли @id/ и @android:id/ одинаковыми?

Ответы [ 13 ]

340 голосов
/ 17 февраля 2011

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

84 голосов
/ 17 февраля 2011

знак + - это короткий путь для добавления идентификатора в список идентификаторов ресурсов.В противном случае вам нужно иметь их в XML-файле, как это

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>
43 голосов
/ 17 февраля 2011

Иногда вы видите ссылки в файлах макета, такие как:

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

и

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

В чем разница?

.. Я рад, что вы спросили 101

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

«+» означает создание символа, если он еще не существует.Он не нужен (и не должен использоваться) при обращении к символам android: потому что они уже определены для вас платформой, и вы все равно не можете создать свой собственный в этом пространстве имен.

Thisnamespace - это пространство имен фреймворка.например, вам нужно использовать @android:id/list, потому что это идентификатор, который фреймворк ожидает найти .. (фреймворк знает только об идентификаторах в пространстве имен android.)

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

36 голосов
/ 13 июня 2014

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

android:id="@+id/my_button"

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

, в то время как

android:layout_below="@id/my_button"

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

9 голосов
/ 03 декабря 2012

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

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

7 голосов
/ 23 сентября 2017

Очень просто:

"@ + ..." - создать новый

"@ ..." - ссылка на существующий

Источник: https://developer.android.com/guide/topics/resources/layout-resource.html#idvalue

6 голосов
/ 30 августа 2012

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

android:id="@+id/my_button"

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

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

4 голосов
/ 08 сентября 2012

Android использует некоторые файлы, называемые ресурсами, где хранятся значения для файлов XML.

Теперь, когда вы используете @ id / для объекта XML, он пытается сослаться на идентификатор, который уже зарегистрирован в файлах значений. С другой стороны, когда вы используете @ + id /, он регистрирует новый идентификатор в файлах значений, как подразумевается символом «+».

Надеюсь, это поможет:).

4 голосов
/ 30 апреля 2012

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

Это, я думаю, должно быть решено как можно скорее, потому что это может (и исходя из опыта) запутать некоторых разработчиков в мысли, что с их синтаксисом что-то не так, и попытатьсяотлаживать, даже если на самом деле нечего отлаживать.

4 голосов
/ 17 февраля 2011

@id/ и @android:id/ не совпадают.

@id/ ссылка на идентификатор в вашем приложении, @android:id/ ссылка на элемент на платформе Android.

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

...