Android getResources().getDrawable() deprecated API 22
以下解决方法摘自 stackoverflow , 点击下方链接可跳转
No.1
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.
EXTRA) drawables with theme attributes from another theme
ResourcesCompat.getDrawable(getResources(), R.drawable.name, anotherTheme);
Explanation:
API 21 (Android 5.0 Lollipop) introduced some new theme attributes such as android:colorAccent
that modify the appearance of drawables that hold references to those new theme attributes values.The AppCompat library handles pre and post-Lollipop drawable styling for you.
If you do use the deprecated getDrawable()
method to obtain a drawable resource with theme attributes, you will get a partially-styled drawable and a logcat warning.You can see this in API 22 android.content.res.Resources
source code:
@Deprecated
@Nullable
public Drawable getDrawable(int id) throws NotFoundException {
final Drawable d = getDrawable(id, null);
if (d != null && d.canApplyTheme()) {
Log.w(TAG, "Drawable " + getResourceName(id) + " has unresolved theme "
+ "attributes! Consider using Resources.getDrawable(int, Theme) or "
+ "Context.getDrawable(int).", new RuntimeException());
}
return d;
}
No.2
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)
.