Como obtenho o ID do recurso de uma imagem se eu souber o nome?

Respostas:

269

Com algo assim:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
Francesco Laurita
fonte
10
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
John Watson
1
getResource()e getPackageName()mostrando erro. cannot resolve method
Srujan Barai
@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.

Link: Recuperando recursos dinamicamente no Android

VSB
fonte
2
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_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

alerta

Outra maneira é consultar a documentação da classe android.R.drawable .

naXa
fonte
1
@Milaaaad, o que você quer dizer?
NaXa
isso significa i confuso com recursos no código e eu usá-lo em sala de aula não atividade
Milaaaad
1
@Milaaaad Este método é para recursos do sistema. Eles não dependem do contexto.
NaXa
10

Você pode usar esta função para obter uma identificação de recurso:

public static int getResourseId(Context context, String pVariableName, String pResourcename, String pPackageName) throws RuntimeException {
    try {
        return context.getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        throw new RuntimeException("Error getting Resource ID.", e)
    } 
}


Portanto, se você deseja obter um ID do recurso desenhável , pode chamar o método assim:

getResourseId(MyActivity.this, "myIcon", "drawable", getPackageName());

(ou de um fragmento):

getResourseId(getActivity(), "myIcon", "drawable", getActivity().getPackageName());


Para um ID de recurso de string , você pode chamá-lo assim:

getResourseId(getActivity(), "myAppName", "string", getActivity().getPackageName());

etc ...


Cuidado : gera uma RuntimeException se não conseguir encontrar o ID do recurso. Certifique-se de recuperar corretamente na produção.

Leia isso

Azhar
fonte
4
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)

sunil shah
fonte