2013-05-04 1 views
44

zugreifen In meiner Anwendung muss ich die einige Bitmap-Zeichnungsdateien irgendwo, wo ich nicht die Referenz R behalten möchten. Also erstelle ich eine Klasse DrawableManager, um die Zeichen zu verwalten.wie auf die Zeichenbaren Ressourcen nach Name in Android

public class DrawableManager { 
    private static Context context = null; 

    public static void init(Context c) { 
     context = c; 
    } 

    public static Drawable getDrawable(String name) { 
     return R.drawable.? 
    } 
} 

Dann möchte ich den ziehbar durch Namen wie diese irgendwo zu bekommen (die car.png innerhalb der res/Drawables gesetzt wird):

Drawable d= DrawableManager.getDrawable("car.png"); 

aber wie Sie sehen können, kann ich keinen Zugriff die Betriebsmittel durch den Namen:

public static Drawable getDrawable(String name) { 
    return R.drawable.? 
} 

Irgendwelche Alternativen?

Antwort

109

Beachten Sie, dass Ihr Ansatz fast immer der falsche Weg ist, Dinge zu tun (besser, den Kontext in das Objekt selbst zu übergeben, das den Zeichenbereich verwendet, als einen statischen Context irgendwo zu halten).

Da, wenn Sie die dynamische ziehbar Laden tun möchten, können Sie getIdentifier verwenden:

Resources resources = context.getResources(); 
final int resourceId = resources.getIdentifier(name, "drawable", 
    context.getPackageName()); 
return resources.getDrawable(resourceId); 
+1

'besser selbst den Kontext in das Objekt zu übergeben, die ziehbar als hält ein statischer Kontext verwendet somewhere' Hallo, können Sie uns sagen mehr? – hguser

+1

@hguser - Der Grund, warum Sie ein 'Drawable' möchten, ist, es auf dem Bildschirm anzuzeigen - jeder Ansicht/Aktivität/Fragment ist ein' Context' zugeordnet - übergeben Sie diesen 'Context' in Ihre' getDrawable' Methode. – ianhanniballake

+0

Danke, ich habe es. – hguser

20

Sie etwas tun könnte, wie this.-

public static Drawable getDrawable(String name) { 
    Context context = YourApplication.getContext(); 
    int resourceId = context.getResources().getIdentifier(name, "drawable", YourApplication.getContext().getPackageName()); 
    return context.getResources().getDrawable(resourceId); 
} 

Um den Kontext zuzugreifen überall können Sie Anwendung Klasse erweitern.

public class YourApplication extends Application { 

    private static YourApplication instance; 

    public YourApplication() { 
     instance = this; 
    } 

    public static Context getContext() { 
     return instance; 
    } 
} 

Und in Ihremzuordnenapplication Tag

<application 
    android:name=".YourApplication" 
    .... 
+3

Danke, ich weiß nie, dass ich den Kontext auf diese Art und Weise vorher bekommen kann. Es scheint, dass es die Codes sauberer machen wird. – hguser

+0

Das Erhalten eines "Kontexts" auf diese Weise, anstatt es weiterzugeben, ist schlecht für die Testbarkeit. Um beispielsweise eine Methode zu testen, die 'YourApplication.getContext()' aufruft, müsste der Test 'YouApplication' zuerst initialisieren, damit' YourApplication.getContext() 'nicht null zurückgibt. Globals in Form von Statik zu erstellen ist generell eine schlechte Übung. – spaaarky21

4

Ändern Bildinhalt:

ImageView image = (ImageView)view.findViewById(R.id.imagenElement); 
    int resourceImage = activity.getResources().getIdentifier(element.getImageName(), "drawable", activity.getPackageName()); 
    image.setImageResource(resourceImage); 
Verwandte Themen