11

I have many icon in drawable folder and I have their name as String. How can I access to drawable folder and change background imageView (or any view) use these name in dynamically. Thanks

Utku Soytaş
  • 1,475
  • 2
  • 19
  • 30

6 Answers6

34

This can be done using reflection:

String name = "your_drawable";
final Field field = R.drawable.getField(name);
int id = field.getInt(null);
Drawable drawable = getResources().getDrawable(id);

Or using Resources.getIdentifier():

String name = "your_drawable";
int id = getResources().getIdentifier(name, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);

Then use this for setting the drawable in either case:

view.setBackground(drawable)
FD_
  • 12,947
  • 4
  • 35
  • 62
  • Should I use `view.setBackground(drawable)` or `view.setBackgroundResource(id)` or what? – Utku Soytaş Feb 18 '14 at 14:36
  • Thanks a lot. That's work :) All answers are correct – Utku Soytaş Feb 18 '14 at 14:41
  • Glad I could help. I upvoted most of the other answers to compensate for the accept. – FD_ Feb 18 '14 at 14:46
  • Thanks :) I can't this because of my reputation :) – Utku Soytaş Feb 18 '14 at 14:47
  • Would anyone have any idea why I would have this problem: String name = "your_drawable"; int id = getResources().getIdentifier(name, "drawable", getPackageName()); Works and id gets an int value that seems right but: Drawable drawable = getResources().getDrawable(id); is always null? – Costas Vrahimis Feb 09 '15 at 06:58
  • 1
    This didn´t worked for me, but I found solution here: http://stackoverflow.com/questions/13351003/find-drawable-by-string – Michal Jun 12 '15 at 07:52
  • I get error: `Can't resolve name getPackageName())`. – Dmitry Aug 31 '18 at 06:00
  • It should be replaced by: `getContext().getPackageName()`. – Dmitry Aug 31 '18 at 06:01
  • @Dmitry you should know how to obtain a context. My code assumes it is used directly inside a subclass of `Context`, such as an `Activity` or `Service`. – FD_ Sep 03 '18 at 09:20
7
int resId = getResources().getIdentifier("your_drawable_name","drawable",YourActivity.this.getPackageName());
Drawable d = YourActivity.this.getResources().getDrawable(resId);
M. Bongini
  • 122
  • 6
5

It can be done like this:

ImageView imageView = new ImageView(this);
imageView.setBackground(getResources().getDrawable(getResources().getIdentifier("name","id",getPackageName())));
nikis
  • 11,166
  • 2
  • 35
  • 45
3

Try this:

public Bitmap getPic (int number)
{
    return
        BitmapFactory.decodeResource
        (
            getResources(), getResourceID("myImage_" + number, "drawable", getApplicationContext())
        );
}

protected final static int getResourceID
(final String resName, final String resType, final Context ctx)
{
    final int ResourceID =
        ctx.getResources().getIdentifier(resName, resType,
            ctx.getApplicationInfo().packageName);
    if (ResourceID == 0)
    {
        throw new IllegalArgumentException
        (
            "No resource string found with name " + resName
        );
    }
    else
    {
        return ResourceID;
    }
}
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
1

if you have the filename as string you can use:

int id = getResources().getIdentifier("name_of_resource", "id", getPackageName());

with this id you can access it like always (assumed its a drawable):

Drawable drawable = getResources().getDrawable(id);
stamanuel
  • 3,731
  • 1
  • 30
  • 45
0

use case if not in any activity, using @FD_ examples

Note:

if you are not in any activity you have to send context param in order to use "getResources()" or "getPackageName()", and "getDrawable(id)" is deprecated, use getDrawer(int id, Theme theme) instead. (Theme can be null):

String name = "your_drawable";
int id = context.getResources().getIdentifier(name, "drawable", 
context.getPackageName());
Drawable drawable = context.getResources().getDrawable(id, null);