Detalhes do ID do Recurso Android
Geralmente usamos o método FindViewById para obter recursos. Por exemplo, geralmente usamos essas declarações no método OnCreate:
btnchecked = (ImageView) findViewById (r.id.imgcheck);
FindViewById é uma maneira conveniente de obter vários objetos de exibição em layout, como botões, etiquetas, ListView e ImageView. Como o nome indica, requer um parâmetro int: ID do recurso.
O ID do recurso é muito útil. O Android atribui automaticamente o ID a cada recurso localizado no diretório res, incluindo vários arquivos de imagem e objetos "@+id" no texto XML. O subdiretório de res quase sempre é fixado, como os que você pode ver sempre: drawable-xxxx, layout, valores e incomum: anim, xml, linha, cor.
Livros didáticos do Android dizem:
res/ drawable/ é usado para armazenar arquivos de imagem;
res/ layout/ é usado para armazenar arquivos de definição de layout;
Res/ valores/ é usado para armazenar algumas variáveis, parâmetros e outros arquivos.
Isso é tudo o que já sabemos. Além disso, o Android atribuirá IDs a todos os recursos no diretório RES, e seus principais princípios de alocação são:
Os arquivos de imagem no desenho são sempre um ID de recurso por arquivo.
Cada visualização no arquivo XML que usa Android: id = ”@+id/xxx” receberá um ID de recurso não utilizado.
Talvez todos adicionem outras regras mais complexas.
Na API ADK, existem muitos métodos que realmente usam o ID do recurso como um parâmetro.
Por exemplo, método getDrawable:
getResources (). getDrawable (r.Drawable.SendsMs_BK));
Literalmente, o método GetResources retorna um objeto Android.content.res.resources.
O método getDrawalbe retorna um objeto desenhado, sabemos que esta é uma imagem.
O parâmetro usado pelo método getDrawable é o ID do recurso.
No entanto, quais números são esses IDs de recurso int? Ou onde estão todos colocados. Se você tiver cuidado o suficiente, poderá encontrá -los no arquivo r.java no diretório gen. Cada ID inteiro hexadecimal tem um nome de atributo muito OO, todos são finais públicos estáticos e é recomendável que você não os modifique manualmente. Esses IDs de recursos estão localizados em diferentes hierarquias de classe. Se você olhar com cuidado, encontrará algumas das regras. Por exemplo, o ID do recurso na classe desenhada realmente representa o arquivo de imagem no diretório RES/Drawable; O ID do recurso contido na classe Layout realmente representa o arquivo XML no diretório RES/Layout; O ID do recurso contido na classe ID realmente representa o objeto Widget usando Android: id = "@+id/xxx" no arquivo XML do layout - é claro, se você usar "@+pneu/xxx", uma classe chamada pneu será criada em R.Java ao compilar.
Através do entendimento acima, descobrimos que o ID do recurso é uma variável ou propriedade que começa com "R." - Porque tudo é definido na classe R - essa classe não é a mesma R que Android.R, e eles não estão no mesmo nível de embalagem. O primeiro define os recursos da estrutura do Android, como: Android.R.Layout.simple_expandable_list_item_1, android.r.layout.simple_expandable_list_item_2. Você já usou esses recursos? Se você tiver tempo, também pode tentar. O outro R é o nosso próprio R, que define nosso próprio ID de recurso. Podemos usar IDs de recurso em r.xxx.yy, e, é claro, podemos usá-los diretamente com números hexadecimais.
O ID do recurso é tão importante no Android, para que possamos obter o recurso desde que obteremos o ID do recurso. Porque, em alguns casos, não podemos usar uma constante como ID do recurso (porque queremos substituí -lo por uma variável), podemos apenas obter dinamicamente o ID do recurso de duas maneiras:
1. Reflexão
A reflexão de Java é tão poderosa que sempre pensamos nisso quando estamos desesperados. Vejamos um pedaço de código:
tente {campo de campo = r.drawable.class.getfield (tipo); int i = field.getInt (new R.Drawable ()); Log.d (tag, i+""); retornar i;} catch (Exceção e) {log.e (tag, e.toString ()); retornar r.Drawable.unkNow;}O tipo é uma variável e seus valores possíveis serão "fecharem", "editar", "ícone", etc. Usamos o campo da classe de reflexão de Java para acessar um campo abaixo da classe R.Drawable. De fato, sabemos que o campo sob R.Drawable é o ID do recurso do arquivo de imagem no diretório Res.Drawable-xxxx. Portanto, a execução do código acima é realmente obter o ID do recurso do arquivo de imagem correspondente através de uma string. Por exemplo, quando o valor do tipo for "ícone", o código acima obterá o ID do recurso do arquivo de imagem do ícone.png no diretório res.Drawable-xxxx e retorne-o a nós. É natural exibir a imagem no ImageView através do ID do recurso.
2. Use o método getIdentifier da classe de recursos
Usar a reflexão ainda é um aborrecimento. Se você usar a classe Android.content.res.resources para fazer a mesma coisa, são apenas duas frases:
Recursos res = getResources (); return res.getIdentifier (tipo, "drawable", getPackagename ());
O método GetResources vem do contexto (ou seja, da classe de atividade), que pode retornar diretamente um objeto de recursos. O método de recursos GetIdentifier pode retornar qualquer ID de recurso em R.Java. Obviamente, você deve especificar 3 parâmetros: nome do campo, nome da classe e nome do pacote. O nome do pacote é parte do nome totalmente qualificado especificado pelo nome do pacote. Se o nome totalmente qualificado de R for Android.R ou Com.company.r, o nome do pacote é "Android" ou "Com.company". getpackagename é realmente this.getpackagename (), que retorna diretamente o nome do pacote desta classe.
O nome da classe é a classe à qual o recurso pertence. Por exemplo, como sabemos, várias classes fixas na classe R.Java: desenhado, ID, string, layout, etc., e muitos IDs de recursos são definidos abaixo deles.
O nome do campo é o nome do ID do recurso. Por exemplo, a definição de ID de recurso:
public static final int del = 0x7f020002;
Del é o nome de um ID de recurso e 0x7F020002 é o seu valor hexadecimal.
Com 3 parâmetros, o método getIdentifier pode obter o ID do recurso comparando métodos dinâmicos.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!