segunda-feira, 23 de agosto de 2010

Android: Usando Reflection para acessar recursos

Olá povo,

Alguns alunos já me perguntaram sobre como obter recursos de uma aplicação Android através do nome do arquivo. Isso pode ser feito através da API de Reflection de Java (pacote java.lang.reflect.*). No exemplo abaixo vou mostrar como obter uma imagem a partir do seu nome.


try {
// Obtém a referência da classe R
Class c = Class.forName("nome.do.pacote.da.app.R");

// Obtém as inner classes: id, layout, drawable, ...
Class[] innerClasses = c.getClasses();

// Procurando inner class drawable
Class drawableClass = null;

for (int i = 0; i < innerClasses.length; i++) {
if (innerClasses[i].getSimpleName()
.equals("drawable")){

drawableClass = innerClasses[i];
break;
}
}
// Procurando o atributo com o nome da imagem
Field f = drawableClass.getField("nome_da_img");

// Obtendo o valor do campo
int resourceId = f.getInt(null);

// Criando uma image view apenas pra exemplificar
ImageView img = new ImageView(context);

// Setando a imagem (recurso) do ImageView
img.setImageResource(resourceId);

} catch (Exception e) {
e.printStackTrace();
}


Como já sabemos, a classe R armazena valores do tipo int que representam os recurso da aplicação. O que fizemos aqui foi obter uma referência para a classe R, depois obter uma referência para a classe interna drawable, e por último, pegar o valor de um dos seus atributos baseados no seu nome.
Podemos fazer isso para as demais classes como id, layout, etc.

4br4ç05,
nglauber