Differenza tra “@ id /” e “@ + id /” in Android


456

Qual è la differenza tra il @id/e @+id/?

Nel @+id/simbolo più +indica di creare un nuovo nome di risorsa e aggiungerlo al R.javafile, ma che dire @id/? Dalla documentazione di ID: quando si fa riferimento a una risorsa Android ID, non è necessario il simbolo più, ma è necessario aggiungere lo spazio dei nomi del pacchetto Android, in questo modo:

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

Ma nell'immagine qui sotto Eclipse non suggerisce alcun tipo di @android:id/.

Immagine che mostra il suggerimento per @ / id e @ + / id

Sono @id/e @android:id/lo stesso?


Dai documenti Android: (ci sono voluti un'eternità per trovare questo, e stavo cercando un problema non correlato) developer.android.com/guide/topics/resources/…
Juan Bonfante,

Risposte:


351

a cui ti riferisci Android resources, che sono già definiti nel sistema Android, @android:id/..mentre per accedere alle risorse che hai definito / creato nel tuo progetto, usi@id/..

Ulteriori informazioni

Secondo i tuoi chiarimenti nella chat, hai detto di avere un problema come questo:

Se lo usiamo android:id="@id/layout_item_id"non funziona. Invece @+id/funziona quindi qual è la differenza qui? E questa era la mia domanda originale.

Bene, dipende dal contesto, quando si utilizza l'attributo XML di android:id, quindi si specifica un nuovo ID e si sta istruendo il parser (o lo si chiama il builder) a creare una nuova voce R.java, quindi è necessario includere un +segno.

Mentre nell'altro caso, ad esempio android:layout_below="@id/myTextView", ti riferisci a un ID che è già stato creato, quindi il parser lo collega all'ID già creato in R.java.

Altre informazioni ancora

Come hai detto nella tua chat, nota che android:layout_below="@id/myTextView"non riconoscerà un elemento con id myTextViewse è scritto dopo l'elemento in cui lo stai usando.


142
Per quanto riguarda "Ulteriori informazioni": è possibile definire la posizione con android:layout_below="@+id/myTextView"e POI definire l'elemento stesso con android:id="@id/myTextView".
Caw

1
@MarcoW Mi ha aiutato immensamente. Ho avuto difficoltà a trovare la soluzione a questo problema (o piuttosto a formulare la voce di ricerca corretta). Immagino che potrebbe meritare una domanda + una risposta propria.
David Miler,

Grazie! Ho avuto lo stesso problema e la documentazione non dice molto su questo argomento. Ma è ovvio: il problema che abbiamo avuto qui non è frequente ...
caw

7
Uso sempre @ + id / su android: id e android: layout_below, è un problema?
Melanke,

4
@melanke: mettere +dentro layout_belowcosì come android:idè davvero bello, dal momento The '+' means to create the symbol if it doesn't already existche Tanmay Mandal ha menzionato nella sua bella (ma sottovalutata) risposta. Per questo motivo, non vi è inoltre alcun effetto di runtime negativo (probabilmente un aumento non misurabile del tempo di compilazione però ^^).
Levita,

86

il segno + è una scorciatoia per aggiungere l'id al tuo elenco di ID risorse. Altrimenti devi averli in un file xml come questo

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

1
@schwiz: e come possiamo usarlo nel nostro layout?
Vikas Patidar,

7
immagina di avere il file di risorse che ho definito nella mia risposta, quindi nel tuo layout puoi avere <View android:id="@id/my_logo"/> Se non avessi il file di risorse che ho definito sopra, allora dovresti farlo come <View android:id="@+id/my_logo"/> nota: devi solo fare + id una volta quindi se in un altro file di layout hai <Visualizza android: id = "+ id / my_logo" /> non avresti bisogno di includere il carattere '+' la prossima volta che usi lo stesso id in un layout.
Nathan Schwermann,

@schwiz: Ok, è utile, ma dove dobbiamo mettere quel file res/drawable/o res/layout/o res/values/e quale sarà il nome di quel file? Se hai qualche link utile a riguardo, ti preghiamo di pubblicare qui.
Vikas Patidar,

1
Ecco tutto ciò che devi sapere sulle convenzioni di denominazione, ecc. Per le tue risorse. Dovresti mettere il file in res / valori / e la convenzione è di nominare gli ID ma puoi chiamarlo come vuoi. developer.android.com/guide/topics/resources/…
Nathan Schwermann,

46

A volte vedi riferimenti nei tuoi file di layout come:

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

e

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

Qual è la differenza?

.. Sono contento che tu l'abbia chiesto ☺

@+id/foosignifica che stai creando un id chiamato foo nello spazio dei nomi della tua applicazione. Puoi fare riferimento ad esso usando @id/foo. @android:id/foosignifica che ti stai riferendo a un ID definito nello spazio dei nomi Android.

Il '+' significa creare il simbolo se non esiste già. Non ti serve (e non dovresti usarlo) quando fai riferimento a android: simboli, perché quelli sono già definiti per te dalla piattaforma e non puoi comunque crearne uno tuo in quello spazio dei nomi.

Questo spazio dei nomi è lo spazio dei nomi del framework. ad esempio, è necessario utilizzare @android:id/listperché questo è l'id che il framework si aspetta di trovare .. (il framework conosce solo gli id ​​nello spazio dei nomi Android.)

Completamente copiato da questa fonte


6
Fruscio !! Completa CTRL + C quindi CTRL + V. felice di aver inserito anche un riferimento al post originale. a proposito, è il tuo blog?
Aman Alam,

se ho dichiarato nel 1 ° layout @ + id / mybutton di tipo Button, quindi non è necessario creare una nuova istanza di se nel 2 ° layout usato come @ id / mybutton. è giusto ?
Hiren Dabhi,

39

In breve

android:id="@+id/my_button"

+ Il segno id Plus indica ad Android di aggiungere o creare un nuovo ID in Risorse.

mentre

android:layout_below="@id/my_button"

aiuta solo a fare riferimento all'ID già generato ..


9

Il segno più ( +) prima del tipo di risorsa è necessario solo quando si definisce un ID risorsa per la prima volta. Quando si compila l'app, gli strumenti dell'SDK utilizzano il nome ID per creare un nuovo ID risorsa nel R.javafile del progetto che fa riferimento EditTextall'elemento. Con l'ID risorsa dichiarato una volta in questo modo, altri riferimenti all'ID non richiedono il segno più. L'uso del segno più è necessario solo quando si specifica un nuovo ID risorsa e non è necessario per risorse concrete come stringhe o layout. Vedere la casella laterale per ulteriori informazioni sugli oggetti risorsa.

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



6

Dalla guida per gli sviluppatori :

android:id="@+id/my_button"

Il simbolo at ( @) all'inizio della stringa indica che il parser XML deve analizzare ed espandere il resto della stringa ID e identificarlo come risorsa ID. Il simbolo più ( +) indica che si tratta di un nuovo nome di risorsa che deve essere creato e aggiunto alle nostre risorse (nel R.javafile). Esistono numerose altre risorse ID offerte dal framework Android. Quando si fa riferimento a un ID risorsa Android, non è necessario il simbolo più, ma è necessario aggiungere lo androidspazio dei nomi del pacchetto, in questo modo:

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


4

C'è un bug con Eclipse in cui a volte se ne hai appena creato uno nuovo @+id/.., non verrà aggiunto immediatamente al file R.java, anche dopo aver pulito il progetto. La soluzione è riavviare Eclipse.

Questo penso che dovrebbe essere risolto il più presto possibile, perché potrebbe (e per esperienza, confondere alcuni sviluppatori nel pensare che ci sia qualcosa di sbagliato nella loro sintassi e provare a eseguire il debug anche se non c'è davvero nulla da debug.


3
Uno dei motivi per cui sono passato ad Android Studio e non ho mai guardato indietro :) (So che non era ancora lì al momento in cui hai scritto la tua risposta)
Konrad Morawski

4

Android utilizza alcuni file chiamati risorse in cui sono memorizzati valori per i file XML.

Ora quando usi @ id / per un oggetto XML, sta cercando di fare riferimento a un id che è già registrato nei file dei valori. D'altra parte, quando usi @ + id / registra un nuovo id nei file dei valori come implicito dal simbolo '+'.

Spero che sia di aiuto :).


4

@id/e @android:id/non è lo stesso.

@id/ID di riferimento nell'applicazione, @android:id/riferimento a un elemento nella piattaforma Android.

Eclipse è sbagliata.


@id/ referencing ID in your applicationStai dicendo che Ma eclise dà Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')quando lo usiamo per fare riferimento alla risorsa dell'applicazione. Quindi qual è la differenza tra il @id/e @+id/? Come hai potuto dire che l'eclissi è sbagliata?
Vikas Patidar,

1
Eclipse è errato nel caso in cui non ti venga mostrato un suggerimento @android: id. E ti sbagli, se stai usando @ id / myId senza dichiararlo con @ + id / myId da qualche parte. Tutti @ id / xxx devono essere dichiarati da qualche parte nell'applicazione utilizzando @ + id / xxx.
Olegas,

Grazie per il chiarimento. Penso che eclissi qui non sia sbagliato, ma mostra suggerimenti basati sul contesto dei nostri elementi di layout. Come dimostra @id/solo in caso diRelativeLayout
Vikas Patidar,

2

La differenza tra @+ide @idè:

  • @+idviene utilizzato per creare un ID per una vista nel R.javafile.
  • @id viene utilizzato per fare riferimento all'ID creato per la vista nel file R.java.

Usiamo @+idcon android:id="", ma cosa succede se l'ID non viene creato e lo stiamo facendo riferimento prima di essere creato (riferimento in avanti).

In tal caso, abbiamo usato @+idper creare id e durante la definizione della vista dobbiamo fare riferimento a esso.

Si prega di fare riferimento al codice seguente:

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

Nel codice sopra, l'id per Spinner @+id/spinnerviene creato in un'altra vista e durante la definizione dello spinner ci riferiamo all'ID creato sopra.

Quindi, dobbiamo creare l'id se stiamo usando la vista prima che la vista sia stata creata.


1

Differenza tra “@+id/”e “@id/”in Android

Il primo viene utilizzato per creare il IDcomponente UI specifico e l'altro viene utilizzato per fare riferimento al componente specifico


1

Se l'elemento di visualizzazione esegue la stessa operazione, è possibile utilizzare il @+idper ogni voce in qualsiasi layout poiché durante la compilazione di più file @+id/fooil R.javafile crea una sola enumerazione. Quindi, ad esempio, se ho un pulsante di salvataggio su ogni pagina che esegue la stessa operazione, lo uso android:id="@+id/button_save"in ogni layout. Il file R.java ha solo una voce per button_save.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.