¿Cuál es el propósito principal de métodos como setTag()
y getTag()
de View
objetos tipo?
¿Estoy en lo cierto al pensar que puedo asociar cualquier número de objetos con una sola Vista?
¿Cuál es el propósito principal de métodos como setTag()
y getTag()
de View
objetos tipo?
¿Estoy en lo cierto al pensar que puedo asociar cualquier número de objetos con una sola Vista?
Digamos que genera un montón de vistas que son similares. Puede establecer un OnClickListener
para cada vista individualmente:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
Luego, debe crear un onClick
método único para cada vista, incluso si hacen cosas similares, como:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
Esto se debe a que onClick
solo tiene un parámetro, a View
, y tiene que obtener otra información de las variables de instancia o de las variables locales finales en los ámbitos adjuntos. Lo que realmente queremos es obtener información de las propias vistas .
Entrar getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
Ahora podemos usar el mismo OnClickListener para cada botón:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
Básicamente es una forma de que las vistas tengan recuerdos .
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
debería hacer el truco para la parte de color. 20 es solo un marcador de posición para la posición de validación de su Vista.Me gustaría agregar algunas palabras.
Aunque el uso
get/setTag(Object)
parece ser muy útil en el caso particular de un patrón ViewHolder, recomendaría pensarlo dos veces antes de usarlo en otros casos. Casi siempre hay otra solución con un mejor diseño.La razón principal es que un código como ese deja de ser compatible con bastante rapidez.
No es obvio para otros desarrolladores lo que diseñó para almacenar como etiqueta en la vista. Los métodos
setTag/getTag
no son descriptivos en absoluto.Simplemente almacena un
Object
, que requiere ser lanzado cuando quierasgetTag
. Puede obtener bloqueos inesperados más adelante cuando decida cambiar el tipo de objeto almacenado en la etiqueta.Aquí hay una historia de la vida real: tuvimos un proyecto bastante grande con muchos adaptadores, operaciones asincrónicas con vistas, etc. Un desarrollador decidió
set/getTag
en su parte del código, pero otro ya había establecido la etiqueta para esta vista. Al final, alguien no pudo encontrar su propia etiqueta y estaba muy confundido. Nos costó varias horas encontrar el error.setTag(int key, Object tag)
se ve mucho mejor, porque puede generar claves únicas para cada etiqueta (usando recursos de identificación ), pero hay una restricción significativa para Android <4.0. De documentos de pelusa:fuente
Podemos usar
setTag()
ygetTag()
establecer y obtener objetos personalizados según nuestros requisitos. ElsetTag()
método toma un argumento de tipoObject
ygetTag()
devuelve unObject
.Por ejemplo,
fuente
Para los desarrolladores web, esto parece ser el equivalente a datos ...
fuente
Esto es muy útil para
ArrayAdapter
uso personalizado . Es algún tipo de optimización. SesetTag
usa como referencia al objeto que hace referencia en algunas partes del diseño (que se muestra enListView
) en lugar defindViewById
.fuente
Referencia: http://developer.android.com/reference/android/view/View.html
fuente
La configuración de TAG es realmente útil cuando tiene un ListView y desea reciclar / reutilizar las vistas. De esa manera, ListView se está volviendo muy similar al RecyclerView más nuevo.
fuente