In meiner Anwendung muss ich einige Bitmap-Drawables irgendwo abrufen, wo ich die Referenz nicht behalten möchte R
. Also erstelle ich eine Klasse DrawableManager
, um die Drawables zu verwalten.
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 das Drawable irgendwo wie folgt mit Namen erhalten (das car.png wird in die res / drawables eingefügt):
Drawable d= DrawableManager.getDrawable("car.png");
Wie Sie jedoch sehen können, kann ich nicht über den Namen auf die Ressourcen zugreifen:
public static Drawable getDrawable(String name) {
return R.drawable.?
}
Irgendwelche Alternativen?
better to pass the context into the object itself that is using the drawable than keeping a static Context somewhere
Hallo, kannst du mir mehr erzählen?Drawable
es auf dem Bildschirm angezeigt werden - jede Ansicht / activity / Fragment eine hatContext
mit ihm verbunden - Pass , dassContext
in IhrergetDrawable
Methode.R.drawable.your_image
Sie sie verwenden möchten.resource.getIdentifier("your_image", "drawable", context.getPackageName())
Ohne bestimmten Code ist es schwer zu erkennen, was falsch ist.Sie könnten so etwas tun.
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 von überall auf den Kontext zuzugreifen, können Sie die Anwendungsklasse erweitern.
public class YourApplication extends Application { private static YourApplication instance; public YourApplication() { instance = this; } public static Context getContext() { return instance; } }
Und ordnen Sie es Ihrem
Manifest
application
Tag zu<application android:name=".YourApplication" ....
quelle
Context
auf diese Weise, anstatt es weiterzugeben, ist schlecht für die Testbarkeit. Um beispielsweise eine aufrufende Methode zuYourApplication.getContext()
testen, müsste der TestYouApplication
zuerst instanziiert werdenYourApplication.getContext()
, damit nicht null zurückgegeben wird. Das Erstellen von Globals in Form von Statik ist im Allgemeinen eine schlechte Praxis.Bildinhalt ändern:
ImageView image = (ImageView)view.findViewById(R.id.imagenElement); int resourceImage = activity.getResources().getIdentifier(element.getImageName(), "drawable", activity.getPackageName()); image.setImageResource(resourceImage);
quelle
Kotlin benutzen
fun Context.getResource(name:String): Drawable? { val resID = this.resources.getIdentifier(name , "drawable", this.packageName) return ActivityCompat.getDrawable(this,resID) }
Ich habe es als Erweiterungsfunktion geschrieben, damit es an jeder Stelle im Code verwendet werden kann.
Hinweis:
context.getResources().getDrawable(resourceId);
ist in Java veraltet .Hinweis : Name der Datei, ist Name ohne Erweiterungen, zum Beispiel "a.png" Name ist "a" .
quelle
wenn Sie int resouce benötigen
Resources resources = context.getResources(); int resourceId = resources.getIdentifier("eskb048", "drawable",context.getPackageName()); // return like: R.drawable.eskb048.png
Wenn Sie Drawable Check benötigen, ist die erste Antwort für alle richtig
quelle
Sie können so erreichen
int resourceId = getResources().getIdentifier("your_drawable_name", "drawable", getPackageName());
Legen Sie die Ressourcen- ID in Imageview fest
imageView.setImageResource(resourceId);
quelle