Unterschied zwischen "@ id /" und "@ + id /" in Android

456

Was ist der Unterschied zwischen @id/und @+id/?

Im @+id/Pluszeichen wird +angewiesen, einen neuen Ressourcennamen zu erstellen und der R.javaDatei hinzuzufügen, aber wie sieht es aus @id/? Aus der Dokumentation von ID: Wenn Sie auf eine Android-Ressource verweisen ID, benötigen Sie nicht das Pluszeichen, sondern müssen den Namespace des Android-Pakets wie folgt hinzufügen:

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

Aber im Bild unten schlägt Eclipse keinerlei Vorschläge vor @android:id/.

Bild zeigt den Vorschlag für die @ / id und @ + / id

Sind @id/und @android:id/das gleiche?

Vikas Patidar
quelle
Aus Android-Dokumenten: (Es hat ewig gedauert, dies zu finden, und ich habe nach einem nicht verwandten Problem gesucht) developer.android.com/guide/topics/resources/…
Juan Bonfante

Antworten:

351

Sie verweisen auf Android resources, die bereits im Android-System definiert sind, @android:id/..während Sie auf Ressourcen zugreifen, die Sie in Ihrem Projekt definiert / erstellt haben@id/..

Mehr Info

Gemäß Ihren Erläuterungen im Chat haben Sie gesagt, dass Sie ein Problem wie das folgende haben:

Wenn wir es benutzen android:id="@id/layout_item_id", funktioniert es nicht. Funktioniert stattdessen @+id/also, was ist der Unterschied hier? Und das war meine ursprüngliche Frage.

Nun, es hängt vom Kontext ab , wenn Sie das XML - Attribut verwenden android:id, dann sind Sie eine neue ID spezifiziert, und Anweisen der Parser (oder der Erbauer nennen) einen neuen Eintrag in erstellen R.java, damit Sie müssen ein +Zeichen einschließen .

Während Sie sich im anderen Fall android:layout_below="@id/myTextView"auf eine bereits erstellte ID beziehen, verknüpft der Parser diese mit der bereits erstellten ID in R.java.

Nochmals mehr Infos

Beachten Sie, wie Sie in Ihrem Chat gesagt haben, dass android:layout_below="@id/myTextView"ein Element mit ID nicht erkannt wird, myTextViewwenn es nach dem Element geschrieben wird, in dem Sie es verwenden.

Aman Alam
quelle
142
Zum "More Info Again": Sie können die Position mit android:layout_below="@+id/myTextView"definieren und dann das Element selbst mit definieren android:id="@id/myTextView".
Caw
1
@MarcoW Das hat mir sehr geholfen. Ich hatte Probleme, die Lösung für dieses Problem zu finden (oder vielmehr den richtigen Sucheintrag zu formulieren). Ich denke, es könnte eine eigene Frage + Antwort verdienen.
David Miler
Vielen Dank! Ich hatte das gleiche Problem und die Dokumentation sagt nicht viel über dieses Thema aus. Aber es ist offensichtlich: Das Problem, das wir hier hatten, ist nicht häufig ...
Caw
7
Ich benutze immer @ + id / bei android: id und android: layout_below, ist das ein Problem?
Melanke
4
@melanke: Das +in layout_belowsowie zu setzen android:idist wirklich in Ordnung, da, The '+' means to create the symbol if it doesn't already existwie Tanmay Mandal in seiner netten (aber unterschätzten) Antwort erwähnte. Aus diesem Grund gibt es auch keinen negativen Laufzeiteffekt (möglicherweise eine unermesslich geringe Verlängerung der Kompilierungszeit ^^).
Levite
86

Das + -Zeichen ist eine Abkürzung, um die ID zu Ihrer Liste der Ressourcen-IDs hinzuzufügen. Andernfalls müssen Sie sie in einer XML-Datei wie dieser haben

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="my_logo" type="id"/>
</resources>
Nathan Schwermann
quelle
1
@schwiz: Und wie können wir es in unserem Layout verwenden?
Vikas Patidar
7
Stellen Sie sich vor, Sie haben die Ressourcendatei, die ich in meiner Antwort definiert habe, und dann in Ihrem Layout. <View android:id="@id/my_logo"/> Wenn Sie die oben definierte Ressourcendatei nicht hätten, müssten Sie dies wie <View android:id="@+id/my_logo"/> folgt tun : Sie müssen die + id nur einmal ausführen Wenn Sie also in einer anderen Layoutdatei <View android: id = "+ id / my_logo" /> verwendet haben, müssen Sie das Zeichen '+' nicht einfügen, wenn Sie das nächste Mal dieselbe ID in einem Layout verwenden.
Nathan Schwermann
@schwiz: Okay, das ist nützlich, aber wo müssen wir diese Datei ablegen res/drawable/oder res/layout/oder res/values/und wie heißt diese Datei? Wenn Sie einen nützlichen Link dazu haben, posten Sie bitte hier.
Vikas Patidar
1
Hier finden Sie alles, was Sie über Namenskonventionen usw. für Ihre Ressourcen wissen müssen. Sie würden die Datei in res / values ​​/ einfügen und die Konvention lautet, sie als IDs zu benennen, aber Sie können sie aufrufen, wie Sie möchten. developer.android.com/guide/topics/resources/…
Nathan Schwermann
46

Manchmal sehen Sie Referenzen in Ihren Layoutdateien wie:

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

und

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

Was ist der Unterschied?

Ich bin froh, dass du gefragt hast ☺

@+id/foobedeutet, dass Sie im Namespace Ihrer Anwendung eine ID mit dem Namen foo erstellen. Sie können mit darauf verweisen @id/foo. @android:id/foobedeutet, dass Sie sich auf eine ID beziehen, die im Android-Namespace definiert ist.

Das '+' bedeutet, das Symbol zu erstellen, falls es noch nicht vorhanden ist. Sie benötigen es nicht (und sollten es auch nicht verwenden), wenn Sie auf Android: -Symbole verweisen, da diese bereits von der Plattform für Sie definiert wurden und Sie in diesem Namespace ohnehin keine eigenen erstellen können.

Dieser Namespace ist der Namespace des Frameworks. Sie müssen beispielsweise @android:id/listdie ID verwenden, die das Framework voraussichtlich finden wird. (Das Framework kennt nur die IDs im Android-Namespace.)

Vollständig aus dieser Quelle kopiert

Tanmay Mandal
quelle
6
Rauschen!! Schließen Sie STRG + C und dann STRG + V ab. Ich bin froh, dass Sie auch auf den ursprünglichen Beitrag verweisen. ist es übrigens dein Blog?
Aman Alam
Wenn ich im 1. Layout @ + id / mybutton vom Typ Button deklariert habe, muss keine neue Instanz erstellt werden, wenn im 2. Layout nur @ id / mybutton verwendet wird. ist es richtig ?
Hiren Dabhi
39

Zusamenfassend

android:id="@+id/my_button"

+ id Pluszeichen weist Android an, eine neue ID in Ressourcen hinzuzufügen oder zu erstellen.

während

android:layout_below="@id/my_button"

Es hilft nur, auf die bereits generierte ID zu verweisen.

Jawad Zeb
quelle
9

Das Pluszeichen ( +) vor dem Ressourcentyp wird nur benötigt, wenn Sie zum ersten Mal eine Ressourcen-ID definieren. Wenn Sie die App kompilieren, verwenden die SDK-Tools den ID-Namen, um eine neue Ressourcen-ID in der R.javaDatei Ihres Projekts zu erstellen, die auf das EditTextElement verweist . Wenn die Ressourcen-ID auf diese Weise einmal deklariert wurde, benötigen andere Verweise auf die ID kein Pluszeichen. Die Verwendung des Pluszeichens ist nur erforderlich, wenn eine neue Ressourcen-ID angegeben wird, und nicht für konkrete Ressourcen wie Zeichenfolgen oder Layouts. Weitere Informationen zu Ressourcenobjekten finden Sie in der Sidebox.

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

Nguyen
quelle
6

Aus dem Entwicklerhandbuch :

android:id="@+id/my_button"

Das at-Symbol ( @) am Anfang der Zeichenfolge gibt an, dass der XML-Parser den Rest der ID-Zeichenfolge analysieren, erweitern und als ID-Ressource identifizieren soll. Das Pluszeichen ( +) bedeutet, dass dies ein neuer Ressourcenname ist, der erstellt und unseren Ressourcen hinzugefügt werden muss (in der R.javaDatei). Es gibt eine Reihe anderer ID-Ressourcen, die vom Android-Framework angeboten werden. Wenn Sie auf eine Android-Ressourcen-ID verweisen, benötigen Sie kein Pluszeichen, sondern müssen den androidPaketnamespace wie folgt hinzufügen :

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

Jeff Axelrod
quelle
4

Es gibt einen Fehler bei Eclipse, bei dem manchmal, wenn Sie gerade eine neue erstellt haben @+id/.., diese nicht sofort zur R.java-Datei hinzugefügt wird, selbst nachdem das Projekt neu erstellt wurde. Die Lösung besteht darin, Eclipse neu zu starten.

Ich denke, dies sollte so schnell wie möglich gelöst werden, da es einige Entwickler (und aus Erfahrung) verwirren kann, zu denken, dass etwas mit ihrer Syntax nicht stimmt, und versuchen, es zu debuggen, selbst wenn es wirklich nichts zu debuggen gibt.

Josephus
quelle
3
Einer der Gründe, warum ich zu Android Studio gewechselt bin und nie zurückgeschaut habe :) (Ich weiß, dass es zu dem Zeitpunkt, als Sie Ihre Antwort geschrieben haben, noch nicht da war)
Konrad Morawski
4

Android verwendet einige Dateien, die als Ressourcen bezeichnet werden und in denen Werte für die XML-Dateien gespeichert sind.

Wenn Sie jetzt @ id / für ein XML-Objekt verwenden, wird versucht, auf eine ID zu verweisen, die bereits in den Wertedateien registriert ist. Wenn Sie dagegen @ + id / verwenden, wird eine neue ID in den Wertedateien registriert, wie dies durch das Symbol '+' impliziert wird.

Hoffe das hilft :).

Tanuj Nayak
quelle
4

@id/und @android:id/ist nicht dasselbe.

@id/Referenzieren der ID in Ihrer Anwendung, @android:id/Verweisen auf ein Element in der Android-Plattform.

Eclipse ist falsch.

Olegas
quelle
Sie sagen, dass @id/ referencing ID in your applicationAber Eclise gibt, Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')wenn wir es verwenden, um die Anwendungsressource zu verweisen. Was ist der Unterschied zwischen @id/und @+id/? Wie könnte man sagen, dass Eclipse falsch ist?
Vikas Patidar
1
Eclipse ist falsch, wenn Ihnen kein @ android: id-Vorschlag angezeigt wird. Und Sie liegen falsch, wenn Sie @ id / myId verwenden, ohne es irgendwo mit @ + id / myId zu deklarieren. Alle @ id / xxx müssen irgendwo in Ihrer Anwendung mit @ + id / xxx deklariert werden.
Olegas
Vielen Dank für Ihre Klarstellung. Ich denke, hier ist Eclipse nicht falsch, sondern zeigt Vorschläge basierend auf dem Kontext unserer Layoutelemente. Wie es @id/nur im Fall vonRelativeLayout
Vikas Patidar
2

Unterschied zwischen @+idund @idist:

  • @+idwird verwendet, um eine ID für eine Ansicht in einer R.javaDatei zu erstellen .
  • @id wird verwendet, um auf die ID zu verweisen, die für die Ansicht in der R.java-Datei erstellt wurde.

Wir verwenden @+idmit android:id="", aber was ist, wenn die ID nicht erstellt wird und wir sie vor dem Erstellen verweisen (Forward Referencing).

In diesem Fall müssen wir @+ideine ID erstellen und beim Definieren der Ansicht darauf verweisen.

Bitte beachten Sie den folgenden Code:

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

Im obigen Code wird die ID für Spinner @+id/spinnerin einer anderen Ansicht erstellt, und während wir den Spinner definieren, verweisen wir auf die oben erstellte ID.

Wir müssen also die ID erstellen, wenn wir die Ansicht verwenden, bevor die Ansicht erstellt wurde.

Kunal Sale
quelle
1

Unterschied zwischen “@+id/”und “@id/”in Android

Die erste wird verwendet, um die IDbestimmte UI-Komponente zu erstellen, und die andere wird verwendet, um die bestimmte Komponente zu referenzieren

Gurpreet Singh
quelle
1

Wenn das Ansichtselement dieselbe Operation ausführt, können Sie die @+idfür jeden Eintrag in einem beliebigen Layout verwenden, da @+id/foodie R.javaDatei beim Kompilieren mehrerer Elemente nur eine Aufzählung erstellt. Wenn ich zum Beispiel auf jeder Seite eine Schaltfläche zum Speichern habe, die denselben Vorgang ausführt, verwende ich sie android:id="@+id/button_save"in jedem Layout. Die R.java-Datei enthält nur einen Eintrag für button_save.

TheChrisONeil
quelle