Подтвердить что ты не робот

В чем разница betwenn @id/и @+ id/in android?

Возможный дубликат:
Что отличается от @+ id/android: list и @id/android: list?

В чем разница между @id/.. and @+id/..? Я не имею в виду разницу между @android:id/.. и @id/..

Пример кода:

<Button
android:id ="@id/add_button"
/>
<Button
android:id ="@+id/remove_button"
/>

В чем разница между двумя определениями id выше?

4b9b3361

Ответ 1

Вы должны использовать нотацию @+ при первом вводе идентификатора в файле XML. Второй и последующий раз, когда вы можете - и должны - отказаться от знака +. Это поможет уловить опечатки.

Например, предположим, что у вас есть RelativeLayout. У вас есть TextView в RelativeLayout, чей android:id есть @+id/label. Позже в XML файле макета вы хотите сослаться на это TextView из другого для целей позиционирования (например, для android:layout_below).

Если вы набрали android:layout_below="@+id/labbel" (обратите внимание на опечатку), во время компиляции это будет считаться ОК. Тем не менее, во время выполнения все не будет работать, начиная от неправильного расположения виджета и заканчивая прямым сбоем, в зависимости от версии Android.

Если вы набрали android:layout_below="@id/labbel" (обратите внимание на опечатку и отсутствующий знак +), вы получите ошибку компиляции.


UPDATE

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="URL:"
        android:layout_alignBaseline="@+id/entry"
        android:layout_alignParentLeft="true"/>
    <EditText
        android:id="@id/entry"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/label"
        android:layout_alignParentTop="true"/>
    <Button
        android:id="@+id/ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/entry"
        android:layout_alignRight="@id/entry"
        android:text="OK" />
    <Button
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/ok"
        android:layout_alignTop="@id/ok"
        android:text="Cancel" />
</RelativeLayout>

Выше, вы увидите RelativeLayout. Вы заметите, что первые вхождения каждого ID получают знак +. Второе и последующее вхождения каждого идентификатора не получают знак +.

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

Знак + эффективно утверждает "присваивает новый идентификатор". Не имея знака + "использовать ранее выделенный идентификатор или не во время компиляции, если такого идентификатора нет".

Ответ 2

В исходных файлах ресурсов макета Android:

"@+id/anyId": добавить новый идентификатор

"@id/anyId": передать существующий идентификатор

Вы должны использовать "@id/anyId" только тогда, когда "anyId" уже добавлен в класс R.java, используя "@+id/anyId"

Ответ 3

Из Руководство для Android

Для значения идентификатора вы должны обычно используйте эту синтаксическую форму: "@+ id/name". плюс символ + указывает, что это новый идентификатор ресурса и инструмент aapt создаст новое целое число ресурсов в класс R.java, если он не уже существуют.

Итак, + предназначен для назначения нового идентификатора, он также будет работать при использовании существующего идентификатора, но там не нужно.

Ответ 4

Второй:

<Button android:id ="@+id/remove_button" />

определяет новый идентификатор. Вы бы использовали первый, когда хотите ссылаться на элемент макета. Например, в относительной компоновке:

android:layout_below="@id/remove_button"