hguser
hguser

Reputation: 36068

how to access the drawable resources by name in android

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

Answers (7)

Ultimo_m
Ultimo_m

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

Manasranjan
Manasranjan

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

Rahman Rezaee
Rahman Rezaee

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

Mahmoud Mabrok
Mahmoud Mabrok

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

ianhanniballake
ianhanniballake

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

Raul
Raul

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

ssantos
ssantos

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

Related Questions