Qual é o objetivo principal de métodos como setTag()
e getTag()
de View
objetos de tipo?
Estou certo ao pensar que posso associar qualquer número de objetos a uma única visualização?
Qual é o objetivo principal de métodos como setTag()
e getTag()
de View
objetos de tipo?
Estou certo ao pensar que posso associar qualquer número de objetos a uma única visualização?
Digamos que você gere várias visualizações semelhantes. Você pode definir um OnClickListener
para cada visualização individualmente:
button1.setOnClickListener(new OnClickListener ... );
button2.setOnClickListener(new OnClickListener ... );
...
Então você deve criar um onClick
método exclusivo para cada visualização, mesmo que eles façam o mesmo, como:
public void onClick(View v) {
doAction(1); // 1 for button1, 2 for button2, etc.
}
Isso ocorre porque onClick
possui apenas um parâmetro, a View
, e precisa obter outras informações de variáveis de instância ou variáveis locais finais nos escopos anexos. O que realmente queremos é obter informações dos próprios pontos de vista .
Digite getTag
/ setTag
:
button1.setTag(1);
button2.setTag(2);
Agora podemos usar o mesmo OnClickListener para cada botão:
listener = new OnClickListener() {
@Override
public void onClick(View v) {
doAction(v.getTag());
}
};
É basicamente uma maneira de as visualizações terem memórias .
public void ui_click(View view){ if(20==((int)view.getTag())) view.setBackgroundColor(colorInt); }
deve fazer o truque para a parte da cor. 20 é apenas um espaço reservado para a posição de validação da sua visualização.Eu gostaria de adicionar algumas palavras.
Embora o uso
get/setTag(Object)
pareça ser muito útil no caso específico de um padrão ViewHolder, recomendo pensar duas vezes antes de usá-lo em outros casos. Quase sempre há outra solução com melhor design.A principal razão é que um código como esse se torna insuportável rapidamente.
Não é óbvio para outros desenvolvedores o que você projetou para armazenar como tag na exibição. Os métodos
setTag/getTag
não são descritivos.Ele apenas armazena um
Object
, que precisa ser convertido quando você desejargetTag
. Você pode obter falhas inesperadas mais tarde quando decide alterar o tipo de objeto armazenado na tag.Aqui está uma história da vida real: tivemos um projeto bastante grande com muitos adaptadores, operações assíncronas com visualizações e assim por diante. Um desenvolvedor decidiu
set/getTag
em sua parte do código, mas outro já havia definido a tag para essa visualização. No final, alguém não conseguiu encontrar sua própria etiqueta e ficou muito confuso. Nos custou várias horas para encontrar o bug.setTag(int key, Object tag)
parece muito melhor, pois você pode gerar chaves exclusivas para cada tag (usando recursos de identificação ), mas há uma restrição significativa para o Android <4.0. Dos documentos do Lint:fonte
Podemos usar
setTag()
egetTag()
definir e obter objetos personalizados conforme nossa exigência. OsetTag()
método pega um argumento do tipoObject
egetTag()
retorna umObject
.Por exemplo,
fonte
Para desenvolvedores web, isso parece ser o equivalente a dados ..
fonte
Isso é muito útil para
ArrayAdapter
uso personalizado . É algum tipo de otimização. ÉsetTag
usado como referência ao objeto que faz referência em algumas partes do layout (que são exibidasListView
) em vez defindViewById
.fonte
Referência: http://developer.android.com/reference/android/view/View.html
fonte
A configuração de TAGs é realmente útil quando você possui um ListView e deseja reciclar / reutilizar as visualizações. Dessa forma, o ListView está se tornando muito semelhante ao RecyclerView mais recente.
fonte