Eu preciso passar um ID de recurso para um método em uma das minhas classes. Ele precisa usar o ID que a referência aponta e também a string. Como devo conseguir isso melhor?
Por exemplo:
R.drawable.icon
Preciso obter o número inteiro disso, mas também preciso acessar a string "icon".
Seria preferível que tudo que eu tivesse que passar para o método fosse a string "icon".
Respostas:
@EboMike: eu não sabia que
Resources.getIdentifier()
existia.Nos meus projetos, usei o seguinte código para fazer isso:
Seria usado assim para obter o valor do
R.drawable.icon
valor inteiro do recursoAcabei de encontrar uma postagem no blog dizendo que
Resources.getIdentifier()
é mais lenta do que usar a reflexão como eu. Confira .fonte
getIdentifier()
tem que fazer duas pesquisas de reflexão. No exemplo acima, vocêgetIdentifier()
usaria a reflexão para obter eDrawable.class
, em seguida, outra pesquisa de reflexão para obter o ID do recurso. Isso explicaria a diferença de velocidade. Dito isto, nenhum é especialmente rápido e, portanto, realmente precisa ser armazenado em cache (principalmente se usado em um loop ou para linhas em aListView
). E o grande problema da abordagem de reflexão é que ela faz suposições sobre os internos do Android que podem mudar em algum lançamento futuro.context
parâmetro?Você pode usar esta função para obter o ID do recurso.
Portanto, se você deseja obter uma função de chamada desenhável como esta
e para string você pode chamar assim
Leia isso
fonte
Isso é baseado na resposta do @Macarse.
Use isso para obter o ID dos recursos de uma maneira mais rápida e amigável ao código.
Exemplo:
fonte
Como obter um ID de recurso de aplicativo a partir do nome do recurso é uma pergunta bastante comum e bem respondida.
Como obter um ID de recurso Android nativo a partir do nome do recurso é menos bem respondido. Aqui está minha solução para obter um recurso desenhável do Android pelo nome do recurso:
O método pode ser modificado para acessar outros tipos de recursos.
fonte
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ return mContext.getDrawable(resourceId); } else { return mContext.getResources().getDrawable(resourceId); }
Se você precisar emparelhar uma string e um int, que tal um Mapa?
fonte
Você pode usar
Resources.getIdentifier()
, embora você precise usar o formato para sua string como você usa em seus arquivos XML, ou sejapackage:drawable/icon
.fonte
getResourceEntryName(id)
para encontrar o nome da sequência. Não é difícil encontrar "ícone" no texto mais longo.Eu fiz assim, está funcionando para mim:
fonte
fonte
fonte
getIdentifier
deve serid
. Isso nem foi mencionado no site de desenvolvimento do Android. onde você conseguiu essa informação?Como você disse que queria passar apenas um parâmetro e que parecia não importar qual, você poderia passar o identificador de recurso e descobrir o nome da string, assim:
Essa pode ser a maneira mais eficiente de obter os dois valores. Você não precisa se preocupar em encontrar apenas a parte "ícone" de uma string mais longa.
fonte
Em seu res / layout / my_image_layout.xml
Para capturar esse ImageView pelo seu valor de + id, dentro do seu código java, faça o seguinte:
fonte
A abordagem Kotlin
Uso:
fonte
No MonoDroid / Xamarin.Android, você pode:
Mas como o GetIdentifier não é recomendado no Android - você pode usar o Reflection assim:
onde sugiro colocar um try / catch ou verificar as strings que você está passando.
fonte
Para obter o ID do Drawable do nome do recurso String, estou usando este código:
fonte