Jaki jest główny cel Settag() getTag () metody podglądu?

Jaki jest główny cel takich metod jak setTag() i getTag() obiektów typu View?

Czy mam rację myśląc, że mogę skojarzyć dowolną liczbę obiektów z jednym widokiem?

Author: Swati Garg, 2011-03-13

7 answers

Powiedzmy, że generujesz kilka podobnych widoków. Można ustawić OnClickListener dla każdego widoku indywidualnie:

button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
 ...

Następnie musisz utworzyć unikalną metodę onClick dla każdego widoku, nawet jeśli robią one podobne rzeczy, jak:

public void onClick(View v) {
    doAction(1); // 1 for button1, 2 for button2, etc.
}

Dzieje się tak dlatego, że onClick ma tylko jeden parametr, a View i musi pobierać inne informacje ze zmiennych instancji lub końcowych zmiennych lokalnych w zakresach zamykających. Tak naprawdę chcemy uzyskać informacje z widoków siebie .

Enter 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());
    }
};

To w zasadzie sposób, aby widoki miały wspomnienia.

 648
Author: Matthew Willis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 17:11:29

Chciałbym dodać kilka słów.

Chociaż użycie get/setTag(Object) wydaje się bardzo przydatne w konkretnym przypadku wzorca Viewholdera, zalecam zastanowienie się dwa razy przed użyciem go w innych przypadkach. Prawie zawsze jest inne rozwiązanie o lepszym designie.

Głównym powodem jest to, że taki kod dość szybko staje się bezużyteczny.

  • Dla innych programistów nie jest oczywiste, co zaprojektowałeś do przechowywania jako znacznik w widoku. Metody setTag/getTag nie są opisowe w wszystkie.

  • Przechowuje tylko Object, który wymaga oddania, gdy chcesz getTag. Nieoczekiwane awarie mogą wystąpić później, gdy zdecydujesz się zmienić typ przechowywanego obiektu w tagu.

  • Oto prawdziwa historia: mieliśmy dość duży projekt z dużą ilością adapterów, operacji asynchronicznych z widokami i tak dalej. Jeden programista zdecydował się na set/getTag w swojej części kodu, ale inny już ustawił znacznik do tego widoku. W końcu ktoś nie mógł znaleźć własnej metki i był bardzo zdezorientowany. Znalezienie pluskwy kosztowało nas kilka godzin.

setTag(int key, Object tag) wygląda znacznie lepiej, ponieważ możesz generować unikalne klucze dla każdego tagu( używając id resources ), ale istnieje znaczące ograniczenie dla Androida

Przed Androidem 4.0, implementacja widoku.setTag(int, Object) przechowywałby obiekty na statycznej mapie, gdzie wartości były / align = "left" / Oznacza to, że jeśli obiekt zawiera jakiekolwiek Zalecenie wskazując na kontekst, kontekst (który wskazuje na prawie wszystko inne) przecieka. Jeśli przejdziesz widok, widok zawiera odniesienie do kontekstu, który go stworzył. Podobnie widok posiadacze zazwyczaj zawierają widok, a kursory są czasami również związane z widokami.

 135
Author: Andrei Buneyeu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-23 09:43:56

Możemy użyć setTag() i getTag(), aby ustawić i uzyskać niestandardowe obiekty zgodnie z naszymi wymaganiami. Metoda setTag() pobiera argument typu Object, A getTag() zwraca Object.

Na przykład,

Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);
 26
Author: Ramkailash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 08:58:58

Dla programistów internetowych wydaje się to być odpowiednikiem danych-..

 20
Author: Oren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-17 14:27:10

Jest to bardzo przydatne przy używaniu niestandardowych ArrayAdapter. To jakiś rodzaj optymalizacji. Tam setTag używane jako odniesienie do obiektu, który odwołuje się do niektórych części układu (wyświetlany w ListView) zamiast findViewById.

static class ViewHolder {
    TextView tvPost;
    TextView tvDate;
    ImageView thumb;
}

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater inflater = myContext.getLayoutInflater();
        convertView = inflater.inflate(R.layout.postitem, null);

        ViewHolder vh = new ViewHolder();
        vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);
        vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);
        vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);
        convertView.setTag(vh);
    }
            ....................
}
 15
Author: shubniggurath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 02:27:08

W przeciwieństwie do identyfikatorów, znaczniki nie są używane do identyfikacji widoków. Znaczniki są zasadniczo dodatkową informacją, która może być powiązana z widokiem. Są one najczęściej używane jako udogodnienie do przechowywania danych związanych z widokami w samych widokach, a nie poprzez umieszczanie ich w osobnej strukturze.

Odniesienie: http://developer.android.com/reference/android/view/View.html

 14
Author: Saad Bilal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 09:01:06

Ustawienie tagów jest bardzo przydatne, gdy masz Widok listy i chcesz ponownie wykorzystać widoki. W ten sposób ListView staje się bardzo podobny do nowszego RecyclerView.

@Override
public View getView(int position, View convertView, ViewGroup parent)
  {
ViewHolder holder = null;

if ( convertView == null )
{
    /* There is no view at this position, we create a new one. 
       In this case by inflating an xml layout */
    convertView = mInflater.inflate(R.layout.listview_item, null);  
    holder = new ViewHolder();
    holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
    convertView.setTag (holder);
}
else
{
    /* We recycle a View that already exists */
    holder = (ViewHolder) convertView.getTag ();
}

// Once we have a reference to the View we are returning, we set its values.

// Here is where you should set the ToggleButton value for this item!!!

holder.toggleOk.setChecked( mToggles.get( position ) );

return convertView;
}
 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 13:59:57