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
@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.
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_alertint id =Resources.getSystem().getIdentifier("ic_dialog_alert","drawable","android");
Eine andere Möglichkeit besteht darin, die Dokumentation für die android.R.drawable- Klasse zu lesen .
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.
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)
Antworten:
Mit so etwas:
quelle
getResources().getIdentifier(name, "id", getPackageName());
, um die ID eines ImageButton zu erhalten (wie Sie es mit R.id.name tun würden).name
? Ich möchte die ID eines Buttons finden, dessen Referenz ich kenne, in meinem Fall ist esbutton1
getResource()
undgetPackageName()
Fehler anzeigen.cannot resolve method
getResource()
undgetPackageName()
sind Methoden aus Aktivität.Sie können dies auch versuchen:
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
quelle
Beispiel für eine öffentliche Systemressource:
Eine andere Möglichkeit besteht darin, die Dokumentation für die android.R.drawable- Klasse zu lesen .
quelle
Mit dieser Funktion können Sie eine Ressourcen-ID abrufen:
Wenn Sie also eine Drawable Resource ID erhalten möchten , können Sie die Methode folgendermaßen aufrufen:
(oder aus einem Fragment):
Für eine String- Ressourcen-ID können Sie sie folgendermaßen aufrufen:
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
quelle
static
, sonstgetResources()
wird nicht funktionieren.Context
war der nicht verfügbar. Fix war entweder zu entfernenstatic
und in einContext
(zBActivity
oderApplication
) zu verschieben; oder eine alternative Korrektur ist das, was Jonathan in seiner Bearbeitung getan hat, nämlich eineContext
an die Methode zu übergeben.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)
quelle