Come posso ottenere l'ID risorsa di un'immagine se ne conosco il nome?


Risposte:


269

Con qualcosa del genere:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());

10
Grazie, questo mi ha aiutato a trovare una soluzione a un problema simile! Userò getResources().getIdentifier(name, "id", getPackageName());per ottenere l'ID di un ImageButton (come si farebbe con R.id.name).
Seleziona0r

42
Si noti che il nome disegnabile NON deve includere un'estensione come ".png"
larham1

1
cosa succede esattamente nella variabile name? Voglio trovare l'id di un pulsante di cui conosco il riferimento, nel mio caso lo èbutton1
John Watson,

1
getResource()e getPackageName()mostrando errore. cannot resolve method
Srujan Barai,

@Srujan Barai, getResource()e getPackageName()sono metodi da Activity.
Berga,

29

Puoi anche provare questo:

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);
}

Ho copiato questi codici sorgente dall'URL sottostante. Sulla base dei test eseguiti in questa pagina, è 5 volte più veloce di getIdentifier (). L'ho trovato anche più pratico e facile da usare. Spero che ti aiuti anche tu.

Link: recupero dinamico delle risorse in Android


2
questo potrebbe essere più veloce, ma ho scoperto che può metterti nei guai se usi proguard. Questo non ha funzionato in previsione almeno per me
Pedro Rainho,

La cattura di eccezioni generiche è un'idea particolarmente negativa. Inoltre, si noti che se non ci sono riferimenti concreti al disegno, Proguard può ottimizzare il riferimento perché non crede che venga utilizzato da nessuna parte.
Paul Lammertsma,

Ora capisco :) intendi che durante l'ottimizzazione drawableNon è possibile trovare modifiche al nome e risorse usando questo metodo, se ho ragione? :)
VSB

1
@VSB: se il tuo ultimo commento è una risposta al commento di Paul Lammertsma immediatamente sopra: No, significa che Proguard non sa che questo è un riferimento alla risorsa, e quindi potrebbe rimuovere la risorsa, ritenendo che non sia utilizzata.
ToolmakerSteve

una volta che usi xxxxhdpi, xxhdpi, ecc. questo metodo diventa meno utile
Someone Somewhere

11

Esempio per una risorsa di sistema pubblica:

// this will get id for android.R.drawable.ic_dialog_alert
int id = Resources.getSystem().getIdentifier("ic_dialog_alert", "drawable", "android");

mettere in guardia

Un altro modo è di fare riferimento alla documentazione per la classe android.R.drawable .


1
@Milaaaad cosa intendi?
naXa,

significa che sono confuso dalle risorse nel codice e lo uso in classe non di attività
Milaaaad,

1
@Milaaaad Questo metodo è per le risorse di sistema. Non dipendono dal contesto.
naXa,

10

È possibile utilizzare questa funzione per ottenere un ID risorsa:

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)
    } 
}


Quindi, se si desidera ottenere un ID risorsa disegnabile , è possibile chiamare il metodo in questo modo:

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

(o da un frammento):

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


Per un ID risorsa stringa puoi chiamarlo così:

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

eccetera...


Attenzione : genera una RuntimeException se non riesce a trovare l'ID risorsa. Assicurati di recuperare correttamente durante la produzione.

Leggi questo


4
Penso che devi rimuoverlo static, altrimenti getResources()non funzionerà.
Richard Le Mesurier,

@Richard Le Mesurier, puoi spiegare perché? Grazie.
Veer,

1
@ Leo.Han Al momento ho fatto quel commento, il Contextnon era disponibile. La correzione consisteva nel rimuoverlo statice spostarlo in un Context(es. ActivityO Application); o la correzione alternativa è ciò che Jonathan ha fatto nella sua modifica, che è passare Contextal metodo.
Richard Le Mesurier,

1
@Richard Le Mesurier, ho controllato la cronologia delle modifiche proprio ora, è proprio come hai detto, grazie per la tua cortese risposta dopo tanti anni :)
Veer,

0

Un altro scenario che ho incontrato.

String imageName = "Hello" e quindi quando viene passato alla funzione getIdentifier come primo argomento, passerà il nome con terminazione null stringa e restituirà sempre zero. Passa questo imageName.substring (0, imageName.length () - 1)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.