Diferencia entre "@ id /" y "@ + id /" en Android

456

¿Cuál es la diferencia entre el @id/y @+id/?

En @+id/el símbolo más le +indica que cree un nuevo nombre de recurso y lo agregue al R.javaarchivo, pero ¿qué pasa @id/? De la documentación de ID: cuando se hace referencia a un recurso de Android ID, no necesita el símbolo más, pero debe agregar el espacio de nombres del paquete de Android, de esta manera:

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

Pero en la imagen a continuación, Eclipse no sugiere ningún tipo de @android:id/.

Imagen que muestra la sugerencia para @ / id y @ + / id

¿Son @id/y @android:id/lo mismo?

Vikas Patidar
fuente
De documentos de Android: (tardé una eternidad en encontrar esto, y estaba buscando un problema no relacionado) developer.android.com/guide/topics/resources/…
Juan Bonfante

Respuestas:

351

te refieres Android resources, que ya están definidos en el sistema Android, @android:id/..mientras que para acceder a los recursos que has definido / creado en tu proyecto, usas@id/..

Más información

Según sus aclaraciones en el chat, dijo que tiene un problema como este:

Si lo usamos android:id="@id/layout_item_id"no funciona. En cambio @+id/funciona, ¿cuál es la diferencia aquí? Y esa fue mi pregunta original.

Bueno, depende del contexto, cuando está utilizando el atributo XML de android:id, entonces está especificando una nueva identificación, y le está ordenando al analizador (o llamarlo el constructor) que cree una nueva entrada R.java, por lo que debe Incluir un+ señal.

Mientras que en el otro caso, como android:layout_below="@id/myTextView", te estás refiriendo a una identificación que ya se ha creado, por lo que el analizador vincula esto con la identificación ya creada R.java.

Más información nuevamente

Como dijiste en tu chat, ten en cuenta que android:layout_below="@id/myTextView"no reconocerá un elemento con id myTextViewsi está escrito después del elemento en el que lo estás usando.

Aman Alam
fuente
142
Con respecto a "Más información de nuevo": puede definir la posición con android:layout_below="@+id/myTextView"y ENTONCES definir el elemento mismo con android:id="@id/myTextView".
caw
1
@MarcoW Eso me ayudó inmensamente. Estaba teniendo problemas para encontrar la solución a este problema (o más bien para formular la entrada de búsqueda correcta). Supongo que podría merecer una pregunta + respuesta propia.
David Miler
¡Gracias! Tuve el mismo problema, y ​​la documentación no dice mucho sobre este tema. Pero es obvio: El problema que tuvimos aquí no es un frecuente ...
CAW
77
Siempre uso @ + id / en android: id y android: layout_below, ¿es un problema?
melanke
44
@melanke: Poner la +entrada layout_belowtambién android:idestá muy bien, ya The '+' means to create the symbol if it doesn't already existque Tanmay Mandal lo mencionó en su buena (pero subestimada) respuesta. Debido a eso, tampoco hay un efecto negativo en el tiempo de ejecución (aunque posiblemente sea un aumento inconmensurablemente pequeño en el tiempo de compilación ^^).
Levita
86

el signo + es un atajo para agregar la identificación a su lista de identificadores de recursos. De lo contrario, debe tenerlos en un archivo xml como este

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>
Nathan Schwermann
fuente
1
@schwiz: ¿Y cómo podemos usarlo en nuestro diseño?
Vikas Patidar
77
imagina que tienes el archivo de recursos que definí en mi respuesta, luego, en tu diseño, puedes tenerlo. <View android:id="@id/my_logo"/> Si no tuvieras el archivo de recursos que definí anteriormente, deberías hacerlo como <View android:id="@+id/my_logo"/> nota: solo necesitas hacer el + id una vez así que si en otro archivo de diseño hiciste <Ver android: id = "+ id / my_logo" /> no necesitarías incluir el carácter '+' la próxima vez que uses el mismo id en un diseño.
Nathan Schwermann
@schwiz: Bueno, eso es útil, pero ¿dónde tenemos que poner ese archivo res/drawable/o res/layout/o res/values/y cuál será el nombre de ese archivo? Si tiene algún enlace útil sobre esto, publique aquí.
Vikas Patidar
1
Aquí encontrará todo lo que necesita saber sobre convenciones de nombres, etc. para sus recursos. Pondría el archivo en res / values ​​/ y la convención es nombrarlo con identificadores, pero puede llamarlo como quiera. developer.android.com/guide/topics/resources/…
Nathan Schwermann
46

A veces ves referencias en tus archivos de diseño como:

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

y

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

¿Cual es la diferencia?

.. Me alegra que hayas preguntado ☺

@+id/foosignifica que está creando una identificación llamada foo en el espacio de nombres de su aplicación. Puedes referirte a él usando @id/foo. @android:id/foosignifica que se refiere a una identificación definida en el espacio de nombres de Android.

El '+' significa crear el símbolo si aún no existe. No lo necesita (y no debe usarlo) cuando hace referencia a Android: símbolos, porque la plataforma ya los ha definido para usted y de todos modos no puede hacer los suyos en ese espacio de nombres.

Este espacio de nombres es el espacio de nombres del marco. por ejemplo, necesitas usar@android:id/list porque esta es la identificación que el marco espera encontrar ... (el marco solo conoce los identificadores en el espacio de nombres de Android).

Completamente copiado de esta fuente

Tanmay Mandal
fuente
66
Whoosh !! Completa CTRL + C y luego CTRL + V. Me alegra que hayas puesto una referencia a la publicación original también. ¿es tu blog por cierto?
Aman Alam
si he declarado en el primer diseño @ + id / mybutton de tipo Button, por lo que no es necesario crear una nueva instancia de if en el segundo diseño solo como @ id / mybutton. Es correcto ?
Hiren Dabhi
39

En breve

android:id="@+id/my_button"

El signo + id Plus le dice a Android que agregue o cree una nueva identificación en Recursos.

mientras

android:layout_below="@id/my_button"

solo ayuda a referir la identificación ya generada.

Zar E Ahmer
fuente
9

El signo más ( +) antes del tipo de recurso solo se necesita cuando se define un ID de recurso por primera vez. Cuando compila la aplicación, las herramientas del SDK usan el nombre de ID para crear una nueva ID de recurso en el R.javaarchivo de su proyecto que se refiere al EditTextelemento. Con el ID de recurso declarado una vez de esta manera, otras referencias al ID no necesitan el signo más. El uso del signo más solo es necesario cuando se especifica un nuevo ID de recurso y no es necesario para recursos concretos como cadenas o diseños. Consulte el recuadro para obtener más información sobre los objetos de recursos.

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

Nguyen
fuente
6

De la Guía del desarrollador :

android:id="@+id/my_button"

El símbolo at ( @) al comienzo de la cadena indica que el analizador XML debe analizar y expandir el resto de la cadena de identificación e identificarlo como un recurso de identificación. El símbolo más ( +) significa que este es un nuevo nombre de recurso que debe crearse y agregarse a nuestros recursos (en el R.javaarchivo). Hay una serie de otros recursos de identificación que ofrece el marco de Android. Al hacer referencia a un ID de recurso de Android, no necesita el símbolo más, pero debe agregar el androidespacio de nombres del paquete, de esta manera:

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

Jeff Axelrod
fuente
4

Hay un error con Eclipse en el que, a veces, si acaba de crear un nuevo @+id/.. , no se agregará inmediatamente al archivo R.java, incluso después de limpiar el proyecto. La solución es reiniciar Eclipse.

Creo que esto debería resolverse lo antes posible, porque puede (y por experiencia) confundirá a algunos desarrolladores al pensar que hay algo mal con su sintaxis, e intentará depurarlo incluso si realmente no hay nada que depurar.

josephus
fuente
3
Una de las razones por las que me cambié a Android Studio y nunca miré hacia atrás :) (Sé que todavía no estaba allí cuando escribiste tu respuesta)
Konrad Morawski
4

Android usa algunos archivos llamados recursos donde los valores se almacenan para los archivos XML.

Ahora, cuando usa @ id / para un objeto XML, intenta hacer referencia a una identificación que ya está registrada en los archivos de valores. Por otro lado, cuando usa @ + id / registra una nueva identificación en los archivos de valores según lo implica el símbolo '+'.

Espero que esto ayude :).

Tanuj Nayak
fuente
4

@id/y @android:id/no es lo mismo

@id/referenciando ID en su aplicación, @android:id/haciendo referencia a un elemento en la plataforma Android.

Eclipse está mal.

Olegas
fuente
@id/ referencing ID in your applicationEstás diciendo que Pero eclise da Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')cuando lo usamos para referir el recurso de la aplicación. Entonces, ¿cuál es la diferencia entre el @id/y @+id/? ¿Cómo puedes decir que el eclipse está mal?
Vikas Patidar
1
Eclipse está mal en caso de no mostrarte una sugerencia de @android: id. Y está equivocado, si está utilizando @ id / myId sin declararlo con @ + id / myId en alguna parte. Todos @ id / xxx deben declararse en algún lugar de su aplicación usando @ + id / xxx.
Olegas
Gracias por tu aclaración. Creo que aquí eclipse no está mal, sino que muestra sugerencias basadas en el contexto de nuestros elementos de diseño. Como se muestra @id/solo en el caso deRelativeLayout
Vikas Patidar
2

La diferencia entre @+idy @ides:

  • @+idse usa para crear una identificación para una vista en el R.javaarchivo.
  • @id se usa para referir la identificación creada para la vista en el archivo R.java.

Usamos @+idcon android:id="", pero qué pasa si la identificación no se crea y la estamos refiriendo antes de crearla (Referencia directa).

En ese caso, tenemos @+idque crear id y mientras definimos la vista tenemos que referirlo.

Por favor, consulte el siguiente código:

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

En el código anterior, id para Spinner @+id/spinner se crea en otra vista y, al definir la ruleta, nos referimos a la identificación creada anteriormente.

Entonces, tenemos que crear la identificación si estamos usando la vista antes de que la vista haya sido creada.

Venta Kunal
fuente
1

Diferencia entre “@+id/”y“@id/” en Android

El primero se usa para crear el IDcomponente ui particular y el otro se usa para referir el componente particular

Gurpreet Singh
fuente
1

Si el elemento de vista realiza la misma operación, puede usar el @+idpara cada entrada en cualquier diseño porque durante la compilación de múltiples @+id/fooel R.javaarchivo solo crea una enumeración. Entonces, por ejemplo, si tengo un botón de guardar en cada página que realiza la misma operación, lo uso android:id="@+id/button_save"en cada diseño. El archivo R.java solo tiene una entrada para button_save.

TheChrisONeil
fuente