W pliku XML możemy przypisać identyfikator do widoku takiego jak, android:id="@+id/something"
a następnie wywołać findViewById()
, ale jak programowo utworzyć widok, jak przypisać identyfikator?
Myślę, że setId()
to nie to samo, co domyślne przypisanie. setId()
jest ekstra.
Czy ktoś może mnie poprawić?
Odpowiedzi:
id
Omówienie AndroidaAndroid
id
to liczba całkowita powszechnie używana do identyfikacji widoków; toid
może być przypisany przez XML (jeśli to możliwe) i za pośrednictwem kodu (programowe). Określenieid
najbardziej użyteczne dla uzyskania punktów odniesienia na XML zdefiniowaneView
a generowany przezInflater
(na przykład za pomocąsetContentView
).Przypisz
id
przezXML
android:id="@+id/
somename"
do widzenia.android:id
zostanie przypisany unikatowyint
do użycia w kodzie.android:id
„sint
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 zgen/
paczki.nazwa/R.java
, po prostu użyj „R.id.
somename”.id
przypisany doPreference
w XML nie jest używany, gdy jegoPreference
generujeView
.)Przypisywanie
id
za pomocą kodu (programowo)id
za pomocąsomeView.setId(
int);
int
musi być pozytywne, ale poza tym jest arbitralne - może być czymkolwiek chcesz (czytaj dalej, jeśli to jest przerażające).Wyjątkowość
id
sXML
-przypisaneid
s będą unikalne.id
ów temat nie muszą być unikalneid
s (teoretycznie) mogą powodować konflikt zXML
przypisanymiid
s.id
nie będą miały znaczenia, jeśli zostaną poprawnie zapytane (czytaj dalej) .Kiedy (i dlaczego) konflikty
id
nie mają znaczeniafindViewById(int)
powtórzy rekursywnie najpierw głębokość przez hierarchię widoku z określonego widoku i zwróci pierwsząView
znalezioną z pasującymid
.id
przypisanych przed XML zdefiniowanymid
w hierarchii,findViewById(R.id.somename)
zawsze zwróci widok zdefiniowany XML, więcid
'd.Dynamiczne tworzenie widoków i przypisywanie
ID
sViewGroup
pomocąid
.LinearLayout
zandroid:id="@+id/placeholder"
.ViewGroup
zView
s.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ść nullonDestroy
. Widocznie wycieka zActivity
(wiszące na to po to jest zniszczone) jest marnotrawstwem .. :)Zarezerwuj
android:id
kod XML do wykorzystania w kodzieWprowadzono 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
:Następnie po utworzeniu grupy ViewGroup lub View możesz dołączyć niestandardowy identyfikator
Sprzeczny
id
przykładDla jasności, jako zaciemniający przykład, przyjrzyjmy się, co dzieje się, gdy
id
za kulisami pojawia się konflikt.layout / mylayout.xml
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):
Tak więc
placeholder
i jedno z naszych nowychTextView
maid
po 12! Ale to nie jest tak naprawdę problem, jeśli zapytamy o widoki potomków osoby zastępczej:*Nie tak źle
źródło
findViewById
jest badanie głębokości, więc „Dopóki nie ma identyfikatorów przypisanych do kodu przypisanych powyżej identyfikatora zdefiniowanego w XML w hierarchii” nie jest technicznie poprawny; to „przed”, a nie „nad”.ids.xml
. Aby uzyskać naprawdę dowolne identyfikatory, użyjView.generateViewId()
(API 17). (Proszę o wyjaśnienie, o ile mi tego brakowało).PreferenceDialogFragmentCompat
nim. Wygląda na to, że identyfikatoryR.id
nie pasują do hierarchii widoku. W ten sposób nie mogę znaleźć widoku według ID.Możesz po prostu użyć
View.setId(integer)
do tego. W XML, nawet jeśli ustawiasz identyfikator ciągu, jest on konwertowany na liczbę całkowitą. Z tego powodu możesz użyć dowolnej (dodatniej) liczby całkowitej dlaViews
dodanego programowo.Podziękowania dla tej odpowiedzi .
źródło
Tak, można wywołać
setId(value)
w dowolnym widoku z dowolnego (pozytywnego) wartość całkowitą, która Ci się podoba, a następnie go znaleźć w kontenerze nadrzędnym użyciufindViewById(value)
. Zauważ, że prawidłowe jest wywoływaniesetId()
z tą samą wartością dla różnych widoków rodzeństwa, alefindViewById()
zwróci tylko pierwszy.źródło
findViewById
znanego przodka jest dobrym pomysłem ze względu na wydajność, ale nie gwarantuje, że znajdzie natychmiastowe dziecko, jeśli jest takie z poprawnym identyfikatorem.