Jaki jest główny cel takich metod jak setTag()
i getTag()
na View
obiektach typu?
Czy mam rację, myśląc, że mogę powiązać dowolną liczbę obiektów z jednym widokiem?
Jaki jest główny cel takich metod jak setTag()
i getTag()
na View
obiektach typu?
Czy mam rację, myśląc, że mogę powiązać dowolną liczbę obiektów z jednym widokiem?
Załóżmy, że generujesz kilka podobnych widoków. Możesz ustawić OnClickListener
osobno dla każdego widoku:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
Następnie musisz utworzyć unikalną onClick
metodę dla każdego widoku, nawet jeśli robią podobne rzeczy, takie jak:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
Jest tak, ponieważ onClick
ma tylko jeden parametr, a View
, i musi uzyskać inne informacje ze zmiennych instancji lub końcowych zmiennych lokalnych w obejmujących zakresach. Tak naprawdę chcemy uzyskać informacje z samych widoków .
Wpisz getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
Teraz możemy użyć tego samego OnClickListener dla każdego przycisku:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
Jest to w zasadzie sposób, by widoki miały wspomnienia .
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
powinien załatwić sprawę z częścią kolorową. 20 jest tylko symbolem zastępczym dla pozycji sprawdzającej poprawność Twojego Widoku.Chciałbym dodać kilka słów.
Chociaż używanie
get/setTag(Object)
wydaje się być bardzo przydatne w szczególnym przypadku wzorca ViewHolder, zalecam zastanowić się dwa razy przed użyciem go w innych przypadkach. Prawie zawsze istnieje inne rozwiązanie o lepszym designie.Głównym powodem jest to, że taki kod dość szybko staje się nieobsługiwany.
Dla innych programistów nie jest oczywiste, co zaprojektowałeś do przechowywania jako znacznik w widoku. Metody
setTag/getTag
w ogóle nie mają charakteru opisowego.Po prostu przechowuje plik
Object
, który trzeba rzucić, kiedy chceszgetTag
. Nieoczekiwane awarie mogą wystąpić później, gdy zdecydujesz się zmienić typ przechowywanego obiektu w znaczniku.Oto prawdziwa historia: mieliśmy całkiem duży projekt z dużą ilością adapterów, operacji asynchronicznych z widokami i tak dalej. Jeden programista postanowił
set/getTag
w swojej części kodu, ale inny już ustawił tag w tym widoku. W końcu ktoś nie mógł znaleźć własnej metki i był bardzo zdezorientowany. Znalezienie błędu kosztowało nas kilka godzin.setTag(int key, Object tag)
wygląda o wiele lepiej, ponieważ możesz wygenerować unikalne klucze dla każdego tagu (używając zasobów identyfikatora ), ale jest znaczące ograniczenie dla Androida <4.0. Z dokumentów Lint:źródło
Możemy używać
setTag()
igetTag()
ustawiać i uzyskiwać niestandardowe obiekty zgodnie z naszymi wymaganiami.setTag()
Metoda wymaga argumentu typuObject
igetTag()
zwracaObject
.Na przykład,
źródło
Dla twórców stron internetowych wydaje się, że jest to odpowiednik danych…
źródło
Jest to bardzo przydatne do niestandardowego
ArrayAdapter
korzystania. To jest jakaś optymalizacja. JestsetTag
używany jako odniesienie do obiektu odniesienia na niektórych częściach układu (czyli wyświetlanie wListView
) zamiastfindViewById
.źródło
Odniesienie: http://developer.android.com/reference/android/view/View.html
źródło
Ustawienie TAG jest bardzo przydatne, gdy masz ListView i chcesz odtworzyć / ponownie wykorzystać widoki. W ten sposób ListView staje się bardzo podobny do nowszego RecyclerView.
źródło