¿Cuál es el objective principal de los métodos setTag () getTag () de View?

¿Cuál es el propósito principal de tales métodos como setTag() y getTag() de objetos tipo View ?

¿Estoy en lo cierto al pensar que puedo asociar cualquier cantidad de objetos con una sola Vista?

Digamos que genera un montón de vistas que son similares. Puede configurar OnClickListener para cada vista individualmente:

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

Luego, debe crear un método onClick ú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 tiene solo un parámetro, una View , y tiene que obtener otra información de variables de instancia o variables locales finales en ámbitos circundantes. Lo que realmente queremos es obtener información de los puntos de vista en sí mismos .

Ingrese 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 .

Me gustaría agregar algunas palabras.

Aunque el uso de get/setTag(Object) parece ser muy útil en el caso particular del patrón ViewHolder, recomendaría pensar dos veces antes de usarlo en otros casos. Casi siempre hay otra buena solución de diseño.

La razón principal es que el código se vuelve insoportable rápidamente.

  • No es obvio para otros desarrolladores lo que diseñó para almacenar como etiqueta a la vista. Los métodos setTag / getTag no son descriptivos en absoluto.

  • Almacena solo un Object , por lo que requiere getTag cuando quieras obtener getTag . Puede obtener un locking inesperado más tarde cuando decide cambiar el tipo de objeto almacenado en la etiqueta.

  • Esta es la 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 de código, pero otro ya había establecido la etiqueta a esta vista. Al final, alguien no pudo encontrar su propia etiqueta y estaba muy confundido. Eso nos costó varias horas encontrar el error.

setTag(int key, Object tag) ve mucho mejor, porque puede generar claves únicas para cada etiqueta (usando recursos de id ), pero hay una restricción significativa para Android <4.0. De los documentos de Lint:

Antes de Android 4.0, la implementación de View.setTag (int, Object) almacenaba los objetos en un mapa estático, donde los valores estaban fuertemente referenciados. Esto significa que si el objeto contiene referencias que apuntan hacia el contexto, el contexto (que apunta a casi todo lo demás) tendrá fugas. Si pasa una vista, la vista proporciona una referencia al contexto que la creó. Del mismo modo, los titulares de vista suelen contener una vista, y los cursores a veces también están asociados con las vistas.

Podemos usar setTag() y getTag() para establecer y obtener objetos personalizados según nuestro requisito. El método setTag() toma un argumento de tipo Object y getTag() devuelve un Object .

Por ejemplo,

 Person p = new Person(); p.setName("Ramkailash"); p.setId(2000001); button1.setTag(p); 

Para los desarrolladores web, esto parece ser el equivalente a datos …

Esto es muy útil para el uso personalizado de ArrayAdapter . Es algún tipo de optimización. setTag usa como referencia al objeto que hace referencia en algunas partes del diseño (que se muestra en ListView ) en lugar de 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); } .................... } 

A diferencia de los ID, las tags no se usan para identificar vistas. Las tags son esencialmente una información extra que puede asociarse con una vista. Se usan con mayor frecuencia como una conveniencia para almacenar datos relacionados con vistas en las vistas mismas en lugar de colocarlos en una estructura separada.

Referencia: http://sofes.miximages.com/android/ data.getData(); saveImg.setImageURI(uri); bitmap = ((BitmapDrawable)saveImg.getDrawable()).getBitmap(); byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream); encodeImage = Base64.encodeToString(byteArrayOutputStream.toByteArray(),Base64.DEFAULT); } } public void open(View view) { byte[] bytes =Base64.decode(encodeImage,Base64.DEFAULT); Bitmap decodBitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length); open_Img.setImageBitmap(decodBitmap); }