2010-06-15 10 views

Antwort

245

Damit so etwas wie:

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

Danke, das hat mir geholfen, eine Lösung für ein ähnliches Problem zu finden! Ich benutze 'getResources(). GetIdentifier (name," id ", getPackageName());' um die ID eines ImageButtons zu erhalten (wie bei R.id.name). – Select0r

+38

Beachten Sie, dass der Zeichnungsname keine Erweiterung wie ".png" enthalten sollte – larham1

+9

Diese Antwort sollte als akzeptiert markiert werden. –

26

Sie können auch versuchen, diese:

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 dieses Quellcodes von unten URL kopiert haben. Basierend auf Tests auf dieser Seite ist es 5 mal schneller als getIdentifier(). Ich fand es auch handlicher und einfacher zu benutzen. Hoffe es hilft dir auch.

-Link:Dynamically Retrieving Resources in Android

+1

sein, dies könnte schneller sein, aber ich habe festgestellt, dass Sie Probleme bekommen, wenn Sie proguard verwenden. Das funktioniert zumindest bei mir nicht progard –

+0

Diese getResources(). GetIdentifier arbeitet mit Proguard –

+0

Danke für die Nachricht :) – VSB

9

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

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 Ressourcen-ID erhalten möchten, können Sie kann die Methode so aufrufen:

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

(oder von einem Fragment):

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


Für eine String ID Ressource Sie es so nennen kann:

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.

Read this

+4

Ich denke, Sie müssen 'static' aus dem entfernen, sonst' getResources() 'wird nicht arbeiten. –

+0

@Richard Le Mesurier, können Sie erklären warum? Vielen Dank. –

+1

@ Leo.Han Zu dem Zeitpunkt, als ich diesen Kommentar machte, war der 'Context' nicht verfügbar. Fix war, entweder "statisch" zu entfernen und es in einen "Kontext" zu verschieben (z. B. "Aktivität" oder "Anwendung"); oder alternative Fixes ist das, was Jonathan in seinem Schnitt getan hat, der in einem 'Context' an die Methode übergeben wird. –

10

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

alert

Ein anderer Weg ist die Dokumentation für android.R.drawable Klasse zu beziehen.

+0

dies ist wahr, aber muss Zugang richtigen Kontext – Milaaaad

+1

@Milaaaad was meinst du? – naXa

+0

es bedeutet, dass ich durch Ressourcen im Code verwechselt und ich verwende es in Nicht-Aktivitätsklasse – Milaaaad

0

Ein anderes Szenario, dem ich begegnete.

String imageName = "Hallo" und dann, wenn es in getIdentifier Funktion als erstes Argument übergeben wird, wird es den Namen mit Zeichenfolge null Termination übergeben und wird immer Null zurückgeben. Übergeben Sie diese imageNameString (0, imageName.length() - 1)