Reputation: 36068
In my application, I need to get the some bitmap drawables somewhere where I do not want to keep the reference R
. So I create a class DrawableManager
to manage the drawables.
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.?
}
}
Then I want to get the drawable by name somewhere like this( the car.png is put inside the res/drawables):
Drawable d= DrawableManager.getDrawable("car.png");
However as you can see, I can not access the resources by the name:
public static Drawable getDrawable(String name) {
return R.drawable.?
}
Any alternatives?
Upvotes: 88
Views: 85999
Reputation: 4897
The best solution would be to create a map of your icons in your code
val iconMap: HashMap<String, Int>
String is your key (to that drawable resource) that you can keep in your database, or even the key from backend API response
Int is the resource drawable
iconMap.put("cat", R.drawable.ic_cat)
iconMap.getOrDefault("dog", R.drawable.empty)
This way you make resource usage more visible to other devs
Upvotes: 0
Reputation: 71
You can achieve like this
int resourceId = getResources().getIdentifier("your_drawable_name", "drawable", getPackageName());
Set resourceId In Imageview
imageView.setImageResource(resourceId);
Upvotes: 3
Reputation: 2165
if You need int resouce
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("eskb048", "drawable",context.getPackageName());
// return like: R.drawable.eskb048.png
if your need Drawable check the first answer is correct for all
Upvotes: 1
Reputation: 1482
Using Kotlin
fun Context.getResource(name:String): Drawable? {
val resID = this.resources.getIdentifier(name , "drawable", this.packageName)
return ActivityCompat.getDrawable(this,resID)
}
I wrote it as Extension function so It can be used at any place in code.
Note: context.getResources().getDrawable(resourceId);
is deprecated in Java.
Note: name of file,is name without extensions for ex "a.png" name will be "a".
Upvotes: 9
Reputation: 200120
Note that your approach is almost always the wrong way to do things (better to pass the context into the object itself that is using the drawable than keeping a static Context
somewhere).
Given that, if you want to do dynamic drawable loading, you can use getIdentifier:
Resources resources = context.getResources();
final int resourceId = resources.getIdentifier(name, "drawable",
context.getPackageName());
return resources.getDrawable(resourceId);
Upvotes: 193
Reputation: 91
Modify image content:
ImageView image = (ImageView)view.findViewById(R.id.imagenElement);
int resourceImage = activity.getResources().getIdentifier(element.getImageName(), "drawable", activity.getPackageName());
image.setImageResource(resourceImage);
Upvotes: 9
Reputation: 16536
You could do something like 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);
}
In order to access the context from anywhere, you may extend Application class.-
public class YourApplication extends Application {
private static YourApplication instance;
public YourApplication() {
instance = this;
}
public static Context getContext() {
return instance;
}
}
And map it in your Manifest
application
tag
<application
android:name=".YourApplication"
....
Upvotes: 23