321

I have an image res/drawable/test.png (R.drawable.test).
I want to pass this image to a function which accepts Drawable, e.g. mButton.setCompoundDrawables().

So how can I convert an image resource to a Drawable?

9 Answers 9

622

Your Activity should have the method getResources. Do:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );


As of API version 21 this method is deprecated and can be replaced with:

Drawable myIcon = AppCompatResources.getDrawable(context, R.drawable.icon);

If you need to specify a custom theme, the following will apply it, but only if API is version 21 or greater:

Drawable myIcon =  ResourcesCompat.getDrawable(getResources(), R.drawable.icon, theme);
Sign up to request clarification or add additional context in comments.

11 Comments

If you happen to want this outside of an Activity class, you'll have to find some other way to reach the Context where getResources() lives; this answer recommends passing it into the constructor
As of API version 21 this method is deprecated and you should be replaced by: Drawable drawable = ResourcesCompat.getDrawable(getResources(), page.getImageId(), null);
@Boren is it the same as to use ContextCompat.getDrawable(this, R.drawable.icon);?
None of the above suggestions seem to work if R.drawable.icon is a Vector drawable.
DON'T USE THIS IF YOU ARE USING VECTOR DRAWABLE. Use AppCompatResources.getDrawable(context, R.drawable.icon ) instead.
|
142

This code is deprecated:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

Use this instead:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

1 Comment

Be aware that this will apply the theme from the given context. If you want to ensure no theme is used, you can use ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null); (where the 3rd param is an optional Theme instance).
23

The getDrawable (int id) method is deprecated as of API 22.

Instead you should use the getDrawable (int id, Resources.Theme theme) for API 21+

Code would look something like this.

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}

3 Comments

why not pass null for every api? Plus: Are you sure that null is the best option?
The getDrawable(int id, Resources.Theme theme) didn't come about until API 21.
or getResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
14

I would just like to add that if you are getting "deprecated" message when using getDrawable(...) you should use the following method from the support library instead.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

You do not have to use getResources() when using this method.

This is equivalent to doing something like

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

This works on both pre and post Lollipop versions.

Comments

5

Get Drawable from vector resource irrespective of, whether its vector or not:

AppCompatResources.getDrawable(context, R.drawable.icon);

Note:
ContextCompat.getDrawable(context, R.drawable.icon); will produce android.content.res.Resources$NotFoundException for vector resource.

1 Comment

Excellent answer!!
4

If you are trying to get the drawable from the view where the image is set as,

ivshowing.setBackgroundResource(R.drawable.one);

then the drawable will return only null value with the following code...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

So, it's better to set the image with the following code, if you wanna retrieve the drawable from a particular view.

 ivshowing.setImageResource(R.drawable.one);

only then the drawable will we converted exactly.

Comments

2

If you are inheriting from a fragment you can do:

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

1 Comment

That's worked for me, after Android Studio suggestion it converts to requireActivity()!!.getDrawable(R.drawable.id)
2

You must get it via compatible way, others are deprecated:

Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), R.drawable.my_drawable, null);

Comments

0

In Kotlin you can do like this:

binding.floatingActionButton.setImageDrawable(
            AppCompatResources.getDrawable(this, android.R.drawable.ic_delete))

Where binding is a root View and this refer to Context, You need import

import androidx.appcompat.content.res.AppCompatResources

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.