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.