Dodaję TextViews programowo w pętli for i dodaję je do ArrayList.
Jak korzystać TextView.setId(int id)
? Jaki identyfikator całkowity mam wymyślić, aby nie kolidował z innymi identyfikatorami?
Dodaję TextViews programowo w pętli for i dodaję je do ArrayList.
Jak korzystać TextView.setId(int id)
? Jaki identyfikator całkowity mam wymyślić, aby nie kolidował z innymi identyfikatorami?
Zgodnie z View
dokumentacją
Identyfikator nie musi być unikalny w hierarchii tego widoku. Identyfikator powinien być liczbą dodatnią.
Możesz więc użyć dowolnej dodatniej liczby całkowitej, którą lubisz, ale w tym przypadku mogą istnieć niektóre widoki o równoważnych identyfikatorach. Jeśli chcesz wyszukać jakiś widok w hierarchii, setTag
przydatne może być wywołanie z niektórymi kluczowymi obiektami.
findViewById
jakiekolwiek gwarancje, który widok zostanie zwrócony, jeśli istnieje więcej niż jeden z tym samym identyfikatorem? Dokumenty nic nie wspominają.findViewById
, zwróci pierwszą znalezioną.setContentView()
ma powiedzmy, 10 widoków z ich identyfikatorem ustawionym na ten sam numer identyfikacyjny w tej samej hierarchii , wówczas wywołaniefindViewById([repeated_id])
zwróci pierwszy zestaw widoków z tym jednym powtarzającym się identyfikatorem. O to mi chodziło.Od poziomu API 17 i wyższego można wywoływać: View.generateViewId ()
Następnie użyj View.setId (int) .
Jeśli twoja aplikacja jest kierowana poniżej poziomu API 17, użyj ViewCompat.generateViewId ()
źródło
AtomicInteger
implementację metod.for(;;)
nigdy wcześniej nie widziałem. Jak to się nazywa?Możesz ustawić identyfikatory, których będziesz używać później w
R.id
klasie, używając pliku zasobów xml, i pozwól, aby zestaw SDK systemu Android nadał im unikalne wartości podczas kompilacji.Aby użyć go w kodzie:
źródło
"int currentId = 1000; whateverView.setId(currentId++);
- to zwiększa identyfikator za każdym razemcurrentId++
, zapewniając unikalny identyfikator, i mogę przechowywać Identyfikatory w mojej ArrayList do późniejszego dostępu.<resources>
.Możesz także zdefiniować
ids.xml
wres/values
. Dokładny przykład można zobaczyć w przykładowym kodzie Androida.źródło
Od API 17
View
klasa ma statyczną metodę,generateViewId()
która będzieźródło
To działa dla mnie:
źródło
findViewById()
jest powolną operacją. Podejście to działa, ale kosztem wydajności.(To był komentarz do odpowiedzi dilettante, ale stał się za długi ... hehe)
Oczywiście statyczny nie jest tutaj potrzebny. Możesz użyć SharedPreferences do zapisania, zamiast statycznego. Tak czy inaczej, powodem jest zapisanie bieżącego postępu, aby nie był zbyt wolny dla skomplikowanych układów. Ponieważ w rzeczywistości po jednorazowym użyciu będzie później dość szybki. Jednak nie uważam, że jest to dobry sposób, aby to zrobić, ponieważ jeśli musisz ponownie przebudować ekran (powiedzmy, że
onCreate
jest wywoływany ponownie), prawdopodobnie i tak chcesz zacząć od początku, eliminując potrzebę statycznego. Dlatego po prostu ustaw zmienną instancji zamiast statycznej.Oto mniejsza wersja, która działa nieco szybciej i może być łatwiejsza do odczytania:
Ta powyższa funkcja powinna wystarczyć. Ponieważ, o ile wiem, generowane przez Androida identyfikatory są w miliardach, więc prawdopodobnie wróci
1
za pierwszym razem i zawsze będzie dość szybkie. Ponieważ tak naprawdę nie będzie pętli obok używanych identyfikatorów, aby znaleźć nieużywany. Jednak pętla to nie powinno to rzeczywiście znaleźć używany identyfikator.Jeśli jednak nadal chcesz, aby postęp był zapisywany między kolejnymi odtworzeniami aplikacji i chcesz uniknąć korzystania ze statycznego. Oto wersja SharedPreferences:
Ta odpowiedź na podobne pytanie powinna powiedzieć ci wszystko, co musisz wiedzieć o identyfikatorach w Androidzie: https://stackoverflow.com/a/13241629/693927
EDYCJA / POPRAWKA: Właśnie zdałem sobie sprawę, że całkowicie wygłupiłem rzut obronny. Musiałem być pijany.
źródło
Biblioteka „Compat” obsługuje teraz także
generateViewId()
metodę poziomów API wcześniejszych niż 17.Upewnij się tylko, że używasz wersji
Compat
biblioteki27.1.0+
Na przykład w
build.gradle
pliku umieść:implementation 'com.android.support:appcompat-v7:27.1.1
Następnie możesz po prostu użyć
generateViewId()
zViewCompat
klasy zamiast zView
klasy w następujący sposób://Will assign a unique ID myView.id = ViewCompat.generateViewId()
Miłego kodowania!
źródło
Tylko dodatek do odpowiedzi @phantomlimb,
natomiast
View.generateViewId()
wymagają API poziom> = 17,to narzędzie jest compatibe ze wszystkimi API.
zgodnie z bieżącym poziomem interfejsu API
decyduje o pogodzie przy użyciu systemowego interfejsu API lub nie.
dzięki czemu można używać
ViewIdGenerator.generateViewId()
iView.generateViewId()
w tym samym czasie i nie martw się o uzyskanie tego samego identyfikatoraźródło
for (;;) { … }
pochodzi z kodu źródłowego Androida.generateViewId()
else { return View.generateViewId(); }
czy będzie to nieskończona pętla dla poziomu interfejsu API mniejszego niż 17 urządzeń?W celu dynamicznego generowania Widoku formularza należy użyć API 17
generateViewId ()
Co wygeneruje wartość odpowiednią do użycia w
setId(int)
. Ta wartość nie będzie kolidować z wartościami ID wygenerowanymi w czasie kompilacji przez aapt forR.id
.źródło
...
źródło
Używam:
Używając losowej liczby, zawsze mam ogromną szansę na uzyskanie unikalnego identyfikatora za pierwszym razem.
źródło
źródło
Mój wybór:
źródło