id
Omówienie Androida
Android id
to liczba całkowita powszechnie używana do identyfikacji widoków; to id
może być przypisany przez XML (jeśli to możliwe) i za pośrednictwem kodu (programowe). Określenie id
najbardziej użyteczne dla uzyskania punktów odniesienia na XML zdefiniowane View
a generowany przez Inflater
(na przykład za pomocą setContentView
).
Przypisz id
przezXML
- Dodaj atrybut
android:id="@+id/
somename "
do widzenia.
- Po utworzeniu aplikacji
android:id
zostanie przypisany unikatowy int
do użycia w kodzie.
- Odwołać swój
android:id
„s int
wartości w kodzie za pomocą« R.id.
somename»(w praktyce stałą).
int
można to zmienić z kompilacji na kompilację, więc nigdy nie kopiuj identyfikatora z gen/
paczki.nazwa/ R.java
, po prostu użyj „ R.id.
somename”.
- (Również
id
przypisany do Preference
w XML nie jest używany, gdy jego Preference
generuje View
.)
Przypisywanie id
za pomocą kodu (programowo)
- Ustaw ręcznie
id
za pomocą someView.setId(
int);
- To
int
musi być pozytywne, ale poza tym jest arbitralne - może być czymkolwiek chcesz (czytaj dalej, jeśli to jest przerażające).
- Na przykład, jeśli tworzysz i numerujesz kilka widoków reprezentujących elementy, możesz użyć ich numeru elementu.
Wyjątkowość id
s
XML
-przypisane id
s będą unikalne.
- Kod przypisany
id
ów temat nie muszą być unikalne
- Przypisane kodem
id
s (teoretycznie) mogą powodować konflikt z XML
przypisanymi id
s.
- Te konflikty
id
nie będą miały znaczenia, jeśli zostaną poprawnie zapytane (czytaj dalej) .
Kiedy (i dlaczego) konflikty id
nie mają znaczenia
findViewById(int)
powtórzy rekursywnie najpierw głębokość przez hierarchię widoku z określonego widoku i zwróci pierwszą View
znalezioną z pasującym id
.
- Tak długo, jak nie ma przypisanych kodów
id
przypisanych przed XML zdefiniowanym id
w hierarchii, findViewById(R.id.somename)
zawsze zwróci widok zdefiniowany XML, więc id
'd.
Dynamiczne tworzenie widoków i przypisywanie ID
s
- W układzie XML zdefiniuj puste za
ViewGroup
pomocą id
.
- Takich jak
LinearLayout
z android:id="@+id/placeholder"
.
- Użyć kodu, aby wypełnić zastępczy
ViewGroup
z View
s.
- Jeśli potrzebujesz lub chcesz, przypisz
id
te, które są wygodne dla każdego widoku.
Zapytaj o te widoki potomne za pomocą placeholder.findViewById (wygodnaInt);
Wprowadzono API 17, View.generateViewId()
które pozwala wygenerować unikalny identyfikator.
Jeśli zdecydujesz się zachować odniesienia do swoich widoków , pamiętaj o ich utworzeniu getApplicationContext()
i ustaw dla każdego odwołania wartość null onDestroy
. Widocznie wycieka z Activity
(wiszące na to po to jest zniszczone) jest marnotrawstwem .. :)
Zarezerwuj android:id
kod XML do wykorzystania w kodzie
Wprowadzono API 17, View.generateViewId()
który generuje unikalny identyfikator. (Dzięki zmianom szansy na dokonanie zmian za wskazanie tego.) *
Jeśli ViewGroup
nie można go zdefiniować za pomocą XML (lub nie chcesz, aby tak było), możesz zarezerwować identyfikator za pomocą XML, aby upewnić się, że pozostaje unikalny:
Tutaj wartości / ids.xml definiują niestandardowe id
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Następnie po utworzeniu grupy ViewGroup lub View możesz dołączyć niestandardowy identyfikator
myViewGroup.setId(R.id.reservedNamedId);
Sprzeczny id
przykład
Dla jasności, jako zaciemniający przykład, przyjrzyjmy się, co dzieje się, gdy id
za kulisami pojawia się konflikt.
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
Aby zasymulować konflikt, powiedzmy, że nasz najnowszy kompilator przypisał R.id.placeholder
( @+id/placeholder
) int
wartość 12
..
Następnie MyActivity.java definiuje programowo niektóre widoki widoków (poprzez kod):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
Tak więc placeholder
i jedno z naszych nowych TextView
ma id
po 12! Ale to nie jest tak naprawdę problem, jeśli zapytamy o widoki potomków osoby zastępczej:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*Nie tak źle