Obrigado, isso me ajudou a encontrar uma solução para um problema semelhante! Vou usar getResources().getIdentifier(name, "id", getPackageName());para obter o ID de um ImageButton (como você faria com R.id.name).
Select0r
42
Note que o nome drawable não deve incluir uma extensão como ".png"
larham1
1
o que exatamente se passa na variável name? Eu quero encontrar o id de um botão cuja referência eu sei, no meu caso, ébutton1
@Srujan Barai getResource()e getPackageName()são métodos da Activity.
The Berga
29
Você também pode tentar o seguinte:
try{Class res = R.drawable.class;Field field = res.getField("drawableName");int drawableId = field.getInt(null);}catch(Exception e){Log.e("MyTag","Failure to get drawable id.", e);}
Copiei esses códigos-fonte abaixo do URL. Com base nos testes realizados nesta página, é 5 vezes mais rápido que o getIdentifier (). Eu também achei mais útil e fácil de usar. Espero que ajude você também.
isso pode ser mais rápido, mas eu achei que poderia causar problemas se você usar o programa. Isso não funcionou em proguard pelo menos para mim
Pedro Rainho
Capturar exceções genéricas é uma idéia especialmente ruim. Além disso, observe que, se não houver referências concretas ao drawable, o Proguard poderá otimizar a referência, pois não acredita que esteja sendo usada em qualquer lugar.
Paul Lammertsma
Eu entendo agora :) você quer dizer que durante a otimização drawableName as alterações e os recursos não podem ser encontrados usando esse método, se eu estiver certo? :)
VSB
1
@VSB: se o seu último comentário é uma resposta ao comentário de Paul Lammertsma imediatamente acima: Não, ele significa que a Proguard não sabe que isso é uma referência ao recurso e, portanto, pode removê-lo, acreditando que ele não é usado.
Home
uma vez que você usar xxxxhdpi, xxhdpi, etc. este método torna-se menos úteis
alguém em algum lugar
11
Exemplo para um recurso do sistema público:
// this will get id for android.R.drawable.ic_dialog_alertint id =Resources.getSystem().getIdentifier("ic_dialog_alert","drawable","android");
Eu acho que você precisa remover staticisso, caso contrário getResources()não funcionará.
Richard Le Mesurier
@ Richard Le Mesurier, você pode explicar por quê? Obrigado.
Veer
1
@ Leo.Han No momento em que fiz esse comentário, o item Contextnão estava disponível. Correção era para remover statice movê-lo para um Context(por exemplo, Activityou Application); ou correção alternativa é o que Jonathan fez em sua edição, que é passar um Contextpara o método.
Richard Le Mesurier
1
@ Richard Le Mesurier, eu verifiquei o histórico de edição neste momento, é apenas como o que você disse, obrigado pela sua resposta gentilmente depois de tantos anos :)
Veer
0
Um outro cenário que encontrei.
String imageName = "Hello" e, quando for passada para a função getIdentifier como primeiro argumento, passará o nome com terminação nula da string e sempre retornará zero. Passe este imageName.substring (0, imageName.length () - 1)
Respostas:
Com algo assim:
fonte
getResources().getIdentifier(name, "id", getPackageName());
para obter o ID de um ImageButton (como você faria com R.id.name).name
? Eu quero encontrar o id de um botão cuja referência eu sei, no meu caso, ébutton1
getResource()
egetPackageName()
mostrando erro.cannot resolve method
getResource()
egetPackageName()
são métodos da Activity.Você também pode tentar o seguinte:
Copiei esses códigos-fonte abaixo do URL. Com base nos testes realizados nesta página, é 5 vezes mais rápido que o getIdentifier (). Eu também achei mais útil e fácil de usar. Espero que ajude você também.
Link: Recuperando recursos dinamicamente no Android
fonte
Exemplo para um recurso do sistema público:
Outra maneira é consultar a documentação da classe android.R.drawable .
fonte
Você pode usar esta função para obter uma identificação de recurso:
Portanto, se você deseja obter um ID do recurso desenhável , pode chamar o método assim:
(ou de um fragmento):
Para um ID de recurso de string , você pode chamá-lo assim:
etc ...
Cuidado : gera uma RuntimeException se não conseguir encontrar o ID do recurso. Certifique-se de recuperar corretamente na produção.
Leia isso
fonte
static
isso, caso contráriogetResources()
não funcionará.Context
não estava disponível. Correção era para removerstatic
e movê-lo para umContext
(por exemplo,Activity
ouApplication
); ou correção alternativa é o que Jonathan fez em sua edição, que é passar umContext
para o método.Um outro cenário que encontrei.
String imageName = "Hello" e, quando for passada para a função getIdentifier como primeiro argumento, passará o nome com terminação nula da string e sempre retornará zero. Passe este imageName.substring (0, imageName.length () - 1)
fonte