Was ist der Hauptzweck von Methoden wie setTag()
und getTag()
von View
Typobjekten?
Habe ich Recht, wenn ich denke, dass ich einer einzelnen Ansicht eine beliebige Anzahl von Objekten zuordnen kann?
Was ist der Hauptzweck von Methoden wie setTag()
und getTag()
von View
Typobjekten?
Habe ich Recht, wenn ich denke, dass ich einer einzelnen Ansicht eine beliebige Anzahl von Objekten zuordnen kann?
Angenommen, Sie generieren eine Reihe ähnlicher Ansichten. Sie können OnClickListener
für jede Ansicht einzeln eine festlegen :
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
Dann müssen Sie onClick
für jede Ansicht eine eindeutige Methode erstellen, auch wenn sie ähnliche Aktionen ausführen, z.
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
Dies liegt daran, dass onClick
nur ein Parameter a vorhanden View
ist und andere Informationen von Instanzvariablen oder endgültigen lokalen Variablen in umschließenden Bereichen abgerufen werden müssen. Was wir wirklich wollen, ist, Informationen aus den Ansichten selbst zu erhalten .
Geben Sie getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
Jetzt können wir für jede Schaltfläche denselben OnClickListener verwenden:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
Es ist im Grunde eine Möglichkeit für Ansichten, Erinnerungen zu haben .
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
sollte den Trick für den Farbteil machen. 20 ist nur ein Platzhalter für die Validierungsposition Ihrer Ansicht.Ich möchte ein paar Worte hinzufügen.
Obwohl die Verwendung
get/setTag(Object)
im speziellen Fall eines ViewHolder-Musters sehr nützlich zu sein scheint, würde ich empfehlen, zweimal darüber nachzudenken, bevor Sie es in anderen Fällen verwenden. Es gibt fast immer eine andere Lösung mit besserem Design.Der Hauptgrund ist, dass solcher Code ziemlich schnell nicht mehr unterstützt werden kann.
Für andere Entwickler ist es nicht offensichtlich, was Sie als Tag in der Ansicht speichern möchten. Die Methoden
setTag/getTag
sind überhaupt nicht beschreibend.Es speichert nur eine
Object
, die gegossen werden muss, wenn Sie möchtengetTag
. Sie können später zu unerwarteten Abstürzen kommen, wenn Sie den Typ des im Tag gespeicherten Objekts ändern.Hier ist eine reale Geschichte: Wir hatten ein ziemlich großes Projekt mit vielen Adaptern, asynchronen Operationen mit Ansichten und so weiter. Ein Entwickler entschied sich für
set/getTag
seinen Teil des Codes, aber ein anderer hatte das Tag bereits auf diese Ansicht gesetzt. Am Ende konnte jemand sein eigenes Etikett nicht finden und war sehr verwirrt. Es hat uns mehrere Stunden gekostet, den Fehler zu finden.setTag(int key, Object tag)
sieht viel besser aus, da Sie für jedes Tag eindeutige Schlüssel generieren können (mithilfe von ID-Ressourcen ), aber für Android <4.0 gibt es eine erhebliche Einschränkung. Aus Lint-Dokumenten:quelle
Wir können benutzerdefinierte Objekte gemäß unseren Anforderungen verwenden
setTag()
undgetTag()
festlegen und abrufen. DiesetTag()
Methode verwendet ein Argument vom TypObject
undgetTag()
gibt ein zurückObject
.Zum Beispiel,
quelle
Für Webentwickler scheint dies das Äquivalent zu Daten zu sein.
quelle
Dies ist sehr nützlich für die benutzerdefinierte
ArrayAdapter
Verwendung. Es ist eine Art Optimierung. EssetTag
wird als Referenz auf ein Objekt verwendet, das auf einige Teile des Layouts (die in angezeigt werdenListView
) verweist, anstattfindViewById
.quelle
Referenz: http://developer.android.com/reference/android/view/View.html
quelle
Das Festlegen von TAGs ist sehr nützlich, wenn Sie eine ListView haben und die Ansichten recyceln / wiederverwenden möchten. Auf diese Weise wird die ListView der neueren RecyclerView sehr ähnlich.
quelle