Różnica między „@ id /” a „@ + id /” w Androidzie


456

Jaka jest różnica między @id/i @+id/?

W @+id/symbolu plus +nakazuje utworzenie nowej nazwy zasobu i dodanie do R.javapliku, ale co z @id/? Z dokumentacji ID: podczas odwoływania się do zasobu Androida IDnie potrzebujesz symbolu plusa, ale musisz dodać przestrzeń nazw pakietu Androida, tak jak poniżej:

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

Ale na poniższym obrazku Eclipse nie sugeruje żadnego @android:id/.

Obraz przedstawiający sugestie dla @ / id i @ + / id

@id/i @android:id/takie same?


Z dokumentacji Androida: (zajęło to wieczność, aby to znaleźć, a ja szukałem niezwiązanego problemu) developer.android.com/guide/topics/resources/…
Juan Bonfante

Odpowiedzi:


351

do którego odwołujesz się Android resources, które są już zdefiniowane w systemie Android, @android:id/..a do uzyskiwania dostępu do zasobów, które zdefiniowałeś / utworzyłeś w swoim projekcie, używasz@id/..

Więcej informacji

Zgodnie z wyjaśnieniami na czacie powiedziałeś, że masz taki problem:

Jeśli korzystamy, android:id="@id/layout_item_id"to nie działa. Zamiast tego @+id/działa, więc jaka jest tutaj różnica? I to było moje pierwotne pytanie.

Cóż, to zależy od kontekstu, kiedy używasz atrybutu XML android:id, wtedy określasz nowy identyfikator i instruujesz parser (lub nazwij go konstruktorem), aby utworzył nowy wpis R.java, więc musisz zawierać +znak.

Podczas gdy w innym przypadku, na przykład android:layout_below="@id/myTextView", masz na myśli identyfikator, który już został utworzony, więc parser łączy to z już utworzonym identyfikatorem w R.java.

Więcej informacji Znowu

Jak powiedziałeś na czacie, pamiętaj, że android:layout_below="@id/myTextView"nie rozpozna elementu z identyfikatorem, myTextViewjeśli jest zapisany po elemencie, w którym go używasz.


142
Odnośnie „Więcej informacji”: możesz zdefiniować pozycję za pomocą, android:layout_below="@+id/myTextView"a następnie zdefiniować sam element za pomocą android:id="@id/myTextView".
caw

1
@MarcoW To mi ogromnie pomogło. Miałem problem ze znalezieniem rozwiązania tego problemu (a raczej sformułowania właściwego wpisu wyszukiwania). Wydaje mi się, że zasługuje na pytanie + własną odpowiedź.
David Miler

Dziękuję Ci! Miałem ten sam problem, a dokumentacja niewiele mówi na ten temat. Ale to oczywiste: Problem mieliśmy tutaj nie jest częstym jeden ...
CAW

7
Zawsze używam @ + id / w android: id i android: layout_below, czy to problem?
melanke

4
@melanke: Wkładanie +w to, layout_belowco android:idjest, jest naprawdę w porządku, ponieważ The '+' means to create the symbol if it doesn't already existjak wspomniał Tanmay Mandal w swojej miłej (ale niedocenionej) odpowiedzi. Z tego powodu nie ma również negatywnego wpływu na środowisko uruchomieniowe (możliwe, że jest to niezmiernie mały wzrost czasu kompilacji ^^).
Lewita

86

znak + to skrót do dodania identyfikatora do listy identyfikatorów zasobów. W przeciwnym razie musisz mieć je w pliku XML takim jak ten

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

1
@schwiz: A jak możemy wykorzystać to w naszym układzie?
Vikas Patidar

7
wyobraź sobie, że masz plik zasobów, który zdefiniowałem w mojej odpowiedzi, a następnie w swoim układzie, który możesz mieć. <View android:id="@id/my_logo"/> Jeśli nie masz pliku zasobów, który zdefiniowałem powyżej, musisz to zrobić jak <View android:id="@+id/my_logo"/> uwaga: wystarczy tylko raz wykonać id więc jeśli w innym pliku układu zrobiłeś <Wyświetl android: id = "+ id / my_logo" />, nie będziesz musiał dołączać znaku „+” przy następnym użyciu tego samego identyfikatora w układzie.
Nathan Schwermann

@schwiz: Dobra, to przydatne, ale gdzie musimy umieścić ten plik res/drawable/lub res/layout/lub res/values/i jaka będzie nazwa tego pliku? Jeśli masz jakiś użyteczny link na ten temat, to opublikuj tutaj.
Vikas Patidar

1
Oto wszystko, co musisz wiedzieć o konwencjach nazewnictwa itp. Dla swoich zasobów. Umieściłbyś ten plik w res / wartości /, a konwencja polega na nadaniu mu identyfikatora, ale możesz go nazwać, jak chcesz. developer.android.com/guide/topics/resources/…
Nathan Schwermann

46

Czasami w plikach układu znajdują się odniesienia:

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

i

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

Co za różnica?

.. Cieszę się, że zapytałeś ☺

@+id/foooznacza, że ​​tworzysz identyfikator o nazwie foo w przestrzeni nazw aplikacji. Możesz się do niego odwołać za pomocą @id/foo. @android:id/foooznacza, że ​​masz na myśli identyfikator zdefiniowany w przestrzeni nazw Androida.

„+” Oznacza utworzenie symbolu, jeśli jeszcze nie istnieje. Nie potrzebujesz go (i nie powinieneś go używać) podczas odwoływania się do symboli android: ponieważ są one już zdefiniowane dla ciebie przez platformę i nie możesz tworzyć własnych w tej przestrzeni nazw.

Ta przestrzeń nazw jest przestrzenią nazw frameworka. na przykład musisz użyć, @android:id/listponieważ jest to identyfikator, którego struktura spodziewa się znaleźć .. (struktura wie tylko o identyfikatorach w przestrzeni nazw Androida).

Całkowicie skopiowane z tego źródła


6
Whoosh !! Wypełnij CTRL + C, a następnie CTRL + V. cieszę się, że umieściłeś również odniesienie do oryginalnego postu. nawiasem mówiąc, czy to twój blog?
Aman Alam

jeśli zadeklarowałem w 1. układzie @ + id / mybutton typu Button, więc nie ma potrzeby tworzenia nowej instancji if w 2. układzie używanym jak @ id / mybutton. czy to jest poprawne ?
Hiren Dabhi

39

W skrócie

android:id="@+id/my_button"

+ znak id plus mówi Androidowi, aby dodać lub utworzyć nowy identyfikator w zasobach.

podczas

android:layout_below="@id/my_button"

po prostu pomaga odesłać już wygenerowany identyfikator ..


9

Znak plus ( +) przed typem zasobu jest potrzebny tylko podczas definiowania identyfikatora zasobu po raz pierwszy. Podczas kompilowania aplikacji narzędzia SDK używają nazwy identyfikatora do utworzenia nowego identyfikatora zasobu w R.javapliku projektu, który odwołuje się do EditTextelementu. Gdy identyfikator zasobu zostanie zadeklarowany raz w ten sposób, inne odwołania do identyfikatora nie wymagają znaku plus. Użycie znaku plus jest konieczne tylko przy określaniu nowego identyfikatora zasobu i nie jest potrzebne w przypadku konkretnych zasobów, takich jak ciągi znaków lub układy. Aby uzyskać więcej informacji o obiektach zasobów, zobacz pole boczne.

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



6

Z Przewodnika programisty :

android:id="@+id/my_button"

At-symbol ( @) na początku łańcucha wskazuje, że analizator składni XML powinien przeanalizować i rozwinąć resztę łańcucha identyfikatora oraz zidentyfikować go jako zasób identyfikatora. Symbol plus ( +) oznacza, że ​​jest to nowa nazwa zasobu, którą należy utworzyć i dodać do naszych zasobów (w R.javapliku). Istnieje wiele innych zasobów identyfikatora oferowanych przez platformę Android. Odwołując się do identyfikatora zasobu Androida, nie potrzebujesz symbolu plusa, ale musisz dodać androidprzestrzeń nazw pakietu, tak jak poniżej:

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


4

W środowisku Eclipse występuje błąd, który czasami powoduje @+id/.., że jeśli właśnie utworzyłeś nowy , nie zostanie on natychmiast dodany do pliku R.java, nawet po czystym skompilowaniu projektu. Rozwiązaniem jest zrestartowanie Eclipse.

Myślę, że powinno to zostać rozwiązane tak szybko, jak to możliwe, ponieważ może (i z doświadczenia) pomylić niektórych programistów z myślą, że coś jest nie tak z ich składnią, i spróbować debugować to, nawet jeśli naprawdę nie ma nic do debugowania.


3
Jednym z powodów, dlaczego przeszedłem do Android Studio i nigdy nie patrzył wstecz :) (wiem, że to nie było jeszcze w czasie napisał swoją odpowiedź)
Konrad Morawski

4

Android używa niektórych plików zwanych zasobami, w których przechowywane są wartości plików XML.

Teraz, gdy używasz @ id / dla obiektu XML, próbuje odwoływać się do identyfikatora, który jest już zarejestrowany w plikach wartości. Z drugiej strony, gdy używasz @ + id /, rejestruje on nowy identyfikator w plikach wartości, co sugeruje symbol „+”.

Mam nadzieję że to pomoże :).


4

@id/i @android:id/to nie to samo.

@id/odniesienie do identyfikatora w aplikacji, @android:id/odwołanie do elementu na platformie Android.

Zaćmienie jest złe.


@id/ referencing ID in your applicationMówisz , że Ale eclise daje, Error: No resource found that matches the given name (at 'id' with value '@id/my_resource_id')gdy używamy go do odsyłania do zasobu aplikacji. Jaka jest różnica między @id/i @+id/? Jak możesz powiedzieć, że zaćmienie jest złe?
Vikas Patidar

1
Zaćmienie jest niepoprawne, jeśli nie wyświetla Ci się sugestia @android: id. I mylisz się, jeśli używasz @ id / myId bez zadeklarowania go gdzieś @ + id / myId. Wszystkie @ id / xxx muszą być zadeklarowane gdzieś w aplikacji za pomocą @ + id / xxx.
Olegas

Dzięki za wyjaśnienie. Myślę, że tutaj zaćmienie nie jest złe, pokazuje sugestie oparte na kontekście naszych elementów układu. Jak widać @id/tylko w przypadkuRelativeLayout
Vikas Patidar

2

Różnica między @+idi @idto:

  • @+idsłuży do utworzenia identyfikatora widoku w R.javapliku.
  • @id służy do odsyłania identyfikatora utworzonego dla widoku w pliku R.java.

Używamy @+idz android:id="", ale co jeśli identyfikator nie jest tworzony i odsyłamy go przed utworzeniem (Forward Referencing).

W takim przypadku musimy użyć @+ididentyfikatora i podczas definiowania widoku musimy go odesłać.

Proszę odnieść się do poniższego kodu:

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

W powyższym kodzie id dla Spinnera @+id/spinnerjest tworzony w innym widoku i podczas definiowania spinnera odsyłamy do id utworzonego powyżej.

Musimy więc utworzyć identyfikator, jeśli korzystamy z widoku przed jego utworzeniem.


1

Różnica pomiędzy “@+id/”i “@id/”w Androidzie

Pierwszy służy do tworzenia IDokreślonego komponentu interfejsu użytkownika, a drugi do odniesienia do konkretnego komponentu


1

Jeśli pozycja widok wykonuje tę samą operację można użyć @+iddla każdego wpisu w dowolnym układzie, ponieważ podczas kompilacji wielokrotności plik tworzy tylko jedno wyliczenie. Na przykład, jeśli mam przycisk Zapisz na każdej stronie, która wykonuje tę samą operację, używam w każdym układzie. Plik R.java ma tylko jeden wpis dla button_save.@+id/fooR.javaandroid:id="@+id/button_save"

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.