Wie erhalte ich die Ressourcen-ID eines Bildes, wenn ich dessen Namen kenne?

Antworten:

269

Mit so etwas:

String mDrawableName = "myappicon";
int resID = getResources().getIdentifier(mDrawableName , "drawable", getPackageName());
Francesco Laurita
quelle
10
Danke, das hat mir geholfen, eine Lösung für ein ähnliches Problem zu finden! Ich werde verwenden getResources().getIdentifier(name, "id", getPackageName());, um die ID eines ImageButton zu erhalten (wie Sie es mit R.id.name tun würden).
Select0r
42
Beachten Sie, dass der zeichnbare Name KEINE Erweiterung wie ".png"
larham1
1
Was genau geht in die Variable name? Ich möchte die ID eines Buttons finden, dessen Referenz ich kenne, in meinem Fall ist esbutton1
John Watson
1
getResource()und getPackageName()Fehler anzeigen. cannot resolve method
Srujan Barai
@Srujan Barai, getResource()und getPackageName()sind Methoden aus Aktivität.
Die Berga
29

Sie können dies auch versuchen:

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

Ich habe diesen Quellcode von der folgenden URL kopiert. Basierend auf den auf dieser Seite durchgeführten Tests ist es fünfmal schneller als getIdentifier (). Ich fand es auch praktischer und einfacher zu bedienen. Hoffe es hilft dir auch.

Link: Dynamisches Abrufen von Ressourcen in Android

VSB
quelle
2
Dies könnte schneller sein, aber ich habe festgestellt, dass es Sie in Schwierigkeiten bringen kann, wenn Sie Proguard verwenden. Das hat zumindest bei mir nicht funktioniert
Pedro Rainho
Das Abfangen generischer Ausnahmen ist eine besonders schlechte Idee. Beachten Sie außerdem, dass Proguard die Referenz möglicherweise optimieren kann, wenn es keine eindeutigen Verweise auf das Zeichen gibt, da es nicht glaubt, dass es irgendwo verwendet wird.
Paul Lammertsma
Ich verstehe jetzt :) Sie meinen, dass während der Optimierung drawableName-Änderungen und Ressourcen mit dieser Methode nicht gefunden werden können, wenn ich recht habe? :)
VSB
1
@VSB: Wenn Ihr letzter Kommentar eine Antwort auf den obigen Kommentar von Paul Lammertsma ist: Nein, er meint, dass Proguard nicht weiß, dass dies ein Verweis auf die Ressource ist, und daher die Ressource möglicherweise entfernt, da er glaubt, dass sie nicht verwendet wird.
ToolmakerSteve
Sobald Sie xxxxhdpi, xxhdpi usw. verwenden, wird diese Methode weniger nützlich
Jemand irgendwo am
11

Beispiel für eine öffentliche Systemressource:

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

aufmerksam

Eine andere Möglichkeit besteht darin, die Dokumentation für die android.R.drawable- Klasse zu lesen .

naXa
quelle
1
@Milaaaad was meinst du?
NaXa
Es bedeutet, dass ich durch Ressourcen im Code verwirrt
bin
1
@Milaaaad Diese Methode ist für Systemressourcen. Sie hängen nicht vom Kontext ab.
NaXa
10

Mit dieser Funktion können Sie eine Ressourcen-ID abrufen:

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


Wenn Sie also eine Drawable Resource ID erhalten möchten , können Sie die Methode folgendermaßen aufrufen:

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

(oder aus einem Fragment):

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


Für eine String- Ressourcen-ID können Sie sie folgendermaßen aufrufen:

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

etc...


Vorsicht : Es wird eine RuntimeException ausgelöst, wenn die Ressourcen-ID nicht gefunden wird. Stellen Sie sicher, dass Sie sich in der Produktion ordnungsgemäß erholen.

Lesen Sie dies

Azhar
quelle
4
Ich denke, Sie müssen davon entfernen static, sonst getResources()wird nicht funktionieren.
Richard Le Mesurier
@ Richard Le Mesurier, kannst du erklären warum? Danke dir.
Veer
1
@ Leo.Han Als ich diesen Kommentar machte, Contextwar der nicht verfügbar. Fix war entweder zu entfernen staticund in ein Context(zB Activityoder Application) zu verschieben; oder eine alternative Korrektur ist das, was Jonathan in seiner Bearbeitung getan hat, nämlich eine Contextan die Methode zu übergeben.
Richard Le Mesurier
1
@ Richard Le Mesurier, ich habe gerade den Bearbeitungsverlauf überprüft, es ist genau das, was Sie gesagt haben. Vielen Dank für Ihre freundliche Antwort nach so vielen Jahren :)
Veer
0

Ein anderes Szenario, dem ich begegnet bin.

String imageName = "Hallo". Wenn es dann als erstes Argument an die Funktion getIdentifier übergeben wird, übergibt es den Namen mit der Zeichenfolge nullterminierung und gibt immer null zurück. Übergeben Sie diesen imageName.substring (0, imageName.length () - 1)

Sunil Shah
quelle