With new android API 22 getResources().getDrawable()
is now deprecated.
Now the best approach is to use only getDrawable()
.
What changed?
With new android API 22 getResources().getDrawable()
is now deprecated.
Now the best approach is to use only getDrawable()
.
What changed?
You have some options to handle this deprecation the right (and future proof) way, depending on which kind of drawable you are loading:
A) drawables with theme attributes
ContextCompat.getDrawable(getActivity(), R.drawable.name);
You'll obtain a styled Drawable as your Activity theme instructs. This is probably what you need.
B) drawables without theme attributes
ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);
You'll get your unstyled drawable the old way. Please note: ResourcesCompat.getDrawable()
is not deprecated!
EXTRA) drawables with theme attributes from another theme
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
You should use the following code from the support library instead:
ContextCompat.getDrawable(context, R.drawable.***)
Using this method is equivalent to calling:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return resources.getDrawable(id, context.getTheme());
} else {
return resources.getDrawable(id);
}
As of API 21, you should use the getDrawable(int, Theme)
method instead of getDrawable(int)
, as it allows you to fetch a drawable object associated with a particular resource ID for the given screen density/theme. Calling the deprecated getDrawable(int)
method is equivalent to calling getDrawable(int, null)
.
getDrawable (int id)
method of the Context
class. This is the same as getResources().getDrawable(id, getTheme());
and also uses the new API. –
Aut getDrawable(int, Resources.Theme)
. –
Probst Replace this line :
getResources().getDrawable(R.drawable.your_drawable)
with ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)
EDIT
ResourcesCompat
is also deprecated now. But you can use this:
ContextCompat.getDrawable(this, R.drawable.your_drawable)
(Here this
is the context)
for more details follow this link: ContextCompat
ResourcesCompat
is deprecated. It should work fine. –
Interjoin getResources().getDrawable()
was deprecated in API level 22. Now we must add the theme:getDrawable (int id, Resources.Theme theme) (Added in API level 21)
This is an example:
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
This is an example how to validate for later versions:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
} else {
myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}
Build.VERSION_CODES.LOLLIPOP is API 21
, so shouldn't this be if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
or if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
? Never mind. From below "The method was added in API 21 but it wasn't deprecated until API 22. :)" –
Charmeuse Try this
ContextCompat.getDrawable(getActivity(), R.drawable.drawable_resource_name);
getDrawable(int drawable) is deprecated in API level 22. For reference see this link.
Now to resolve this problem we have to pass a new constructer along with id like as :-
getDrawable(int id, Resources.Theme theme)
For Solutions Do like this:-
In Java:-
ContextCompat.getDrawable(getActivity(), R.drawable.name);
or
imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));
In Kotlin :-
rel_week.background=ContextCompat.getDrawable(this, R.color.colorWhite)
or,
rel_week.background=ContextCompat.getDrawable(requireContext(), R.color.colorWhite)
)
or
rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)
Hope this will help you.Thanks.
In Kotlin you can use extension
fun Context.getMyDrawable(id : Int) : Drawable?{
return ContextCompat.getDrawable(this, id)
}
then use like
context.getMyDrawable(R.drawable.my_icon)
You can use
ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);
that's work for me
Just an example of how I fixed the problem in an array to load a listView, hope it helps.
mItems = new ArrayList<ListViewItem>();
// Resources resources = getResources();
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
// mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));
Try this:
public static List<ProductActivity> getCatalog(Resources res){
if(catalog == null) {
catalog.add(new Product("Dead or Alive", res
.getDrawable(R.drawable.product_salmon),
"Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
catalog.add(new Product("Switch", res
.getDrawable(R.drawable.switchbook),
"Switch by Chip Heath and Dan Heath", 24.99));
catalog.add(new Product("Watchmen", res
.getDrawable(R.drawable.watchmen),
"Watchmen by Alan Moore and Dave Gibbons", 14.99));
}
}
If you are targeting SDK > 21 (lollipop or 5.0) use
context.getDrawable(R.drawable.your_drawable_name)
en api level 14
marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));
Now you need to implement like this
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
//
} else {
//
}
Following single line of code is enough, everything will take care by ContextCompat.getDrawable
ContextCompat.getDrawable(this, R.drawable.your_drawable_file)
For some who still got this issue to solve even after applying the suggestion of this thread(i used to be one like that) add this line on your Application class, onCreate() method
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
As suggested here and here sometimes this is required to access vectors from resources especially when you're dealing with menu items, etc
In case you need drawable from other app targeting SDK 23 and up
PackageManager manager = getApplicationContext().getPackageManager();
Resources resources = null;
try {
resources = manager.getResourcesForApplication("com.anyapp");
}
catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
assert resources != null;
Drawable notiIcon = ResourcesCompat.getDrawable(resources, current.iconId/* drawable resource id */, null);
Build.VERSION_CODES.LOLLIPOP should now be changed to BuildVersionCodes.Lollipop i.e:
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}
BuildVersionCodes
a class specific to Xamarin? –
Galbraith © 2022 - 2024 — McMap. All rights reserved.
getDrawable (int id)
of the classResources
is deprecated. You should now use the methodgetDrawable (int id, Resources.Theme theme)
with the new theme parameter. – AutResources#getDrawable(int)
andResources#getColor(int)
were deprecated. – Todtoday