Czy mogę używać tego samego identyfikatora w innym układzie w systemie Android?

90

Jestem nowy w programowaniu na Androida. Czy można używać tego samego identyfikatora dla obrazów i TextViewsróżnych Layoutplików XML?

Kiedy zaćmienie automatycznie je wyświetla, wyświetla wszystkie zmienne układu z projektu, więc czy będzie kolidować? Do tej pory nie zauważyłem żadnych problemów z używaniem tego samego identyfikatora w różnych układach, ale martwię się na dłuższą metę.

happyhardik
źródło
@Pavel, nadal będziesz potrzebować identyfikatorów, aby dostosować ograniczenia.
Sadda Hussain

Odpowiedzi:

96

Zaleca się używanie różnych identyfikatorów dla różnych układów. Na dłuższą metę, gdy będziesz mieć wiele układów, a tym samym wiele identyfikatorów, ich rozróżnienie będzie bardzo trudne.

Ja zazwyczaj nazwać moje identyfikatory tak: layoutName_elementId.

U mnie działa łatwe znajdowanie identyfikatora, którego szukam, zwłaszcza podczas korzystania z autouzupełniania (wiem, na jakim układzie pracuję, ale tak naprawdę nie znam identyfikatora; w tym przypadku przy mojej strategii nazewnictwa wpisz tylko nazwę układu, a to spowoduje wyświetlenie wszystkich identyfikatorów tego układu).

Więcej informacji na temat układów i identyfikatorów można znaleźć tutaj .

Miłego kodowania,

Chupamobile Evangelist
źródło
2
Jaki jest problem z szukaniem, powiedzmy, ok_buttonw każdej swojej działalności? Dzięki temu autouzupełnianie jest jeszcze bardziej przejrzyste, jeśli wiesz, że szukasz czatu.
Dan Chaltiel
132

Krótka odpowiedź: tak, możesz.

Długa odpowiedź: Możesz to zrobić, ponieważ za każdym razem, gdy używasz findViewById (), aby uzyskać odwołanie do części układu, metoda szuka tylko tego widoku w aktualnie zawyżonym układzie. Więc nawet jeśli masz inny widok z tym samym identyfikatorem w innym układzie, Android nie będzie go tam szukał.

Raghav Sood
źródło
15
Czy możesz udzielić jeszcze dłuższej odpowiedzi? Ponieważ R.id.layout_id jest statyczną liczbą całkowitą i jest wstępnie określana w czasie kompilacji, więc funkcja findViewById () nie będzie znać aktualnie zawyżonego układu.
Chloe,
22
Ze względu na wszystkich, którzy napotkali to pytanie, chciałem odpowiedzieć na prośbę Chloe. Identyfikator byłby taki sam dla każdego widoku, ale nigdy nie pojawiłby się dwa razy w tym samym działaniu. Jako metafora zastanów się, co by się stało, gdybym dał ci plik kartek z kilkoma liczbami. Na kilku z tych kartek widnieje cyfra 4. Patrzysz na jeden z arkuszy i proszę zakreśl czwarty. To jest łatwe. Teraz spójrz na inny arkusz z 4 na nim. Możesz to również znaleźć i zakreślić. Nie ma znaczenia, że ​​liczba jest określona z góry.
Ted Cannelongo,
6
Nie zgadzam się z komentarzem Teda, możesz mieć jednocześnie dwa komponenty o tym samym identyfikatorze działające na tym samym działaniu. Właśnie miałem problem z aplikacją, używałem dwóch różnych ViewPagerów w tym samym czasie w głównym działaniu. Kiedy próbowałem odzyskać ViewPager, który jest aktualnie wyświetlany z identyfikatorem, w rzeczywistości pobrał on drugi działający w tle. Rozwiązałem problem, po prostu nadając dwa identyfikatory unikalne.
Yoann Hercouet
8
@YoannHercouet Uważam, że dzieje się tak, ponieważ obaj byli na tym samym arkuszu (Ćwiczenie)
Naheel
22

Zgodnie z przewodnikami po API dla programistów:

Identyfikator nie musi być unikalny w całym drzewie, ale powinien być unikalny w obrębie części drzewa, które szukasz (często może to być całe drzewo, więc najlepiej jest być całkowicie unikalne, jeśli to możliwe).

Krótka odpowiedź brzmi: nie jest to obowiązkowe, ale dobrą praktyką jest unikanie możliwych konfliktów.

Alex Epelde
źródło
1
Kiedyś przypadkowo utworzyłem te same identyfikatory. Późniejsza zmiana ich nazw była bardzo pracochłonna, ponieważ wszystkie instancje zostały ponownie przygotowane. Oznacza to, że gdy masz konflikt identyfikatora, masz przerąbane. Bardzo trudno będzie wszystko znowu oddzielić.
t3chb0t
@ t3chb0t Naprawdę! Nawet jeśli zaznaczysz „tylko lokalnie”, Android Studio zmienia nazwy wszystkich instancji. To jest absolutnie śmieszne.
John Glen
15

Niezalecane, ponieważ jeśli w przyszłości będziesz musiał dokonać refaktoryzacji view id, Android Studio zrefaktoruje to we wszystkich XMLplikach i klasach i będziesz miał kłopoty.

Ale są też sytuacje, w których musisz użyć tego samego, idna przykład jeśli masz jakieś streszczenie i ponownie używasz wielu układów.

Jeśli masz wiele viewsz tym samym id'sw swoim projekcie i potrzebujesz refaktoryzacji, zrób to ręcznie, nie używaj funkcji budowania w IDE, zmień idwidok docelowy w XMLukładzie, a następnie napraw czerwony błąd w układzie.

Pavel Poley
źródło