看看这两种方法的源代码,它们看起来非常相似。如果您没有向量,则可能会使用其中一个。
ResourcesCompat.getDrawable()
将调用 API 21 或更高版本。它还支持Android API 4 +。它只不过是这个:Resources#getDrawable(int, theme)
public Drawable getDrawable(Resources res, int id, Theme theme)
throws NotFoundException {
final int version = Build.VERSION.SDK_INT;
if (version >= 21) {
return ResourcesCompatApi21.getDrawable(res, id, theme);
} else {
return res.getDrawable(id);
}
}
Where-in 只是调用 .这意味着如果设备不支持矢量可绘制对象,它将不允许绘制矢量可绘制对象。但是,它将允许您传入主题。ResourcesCompatApi21
res.getDrawable(id, theme)
同时,AppCompatResources.getDrawable(Context context, int resId)的
代码更改最终归结为:
Drawable getDrawable(@NonNull Context context, @DrawableRes int resId, boolean failIfNotKnown) {
checkVectorDrawableSetup(context);
Drawable drawable = loadDrawableFromDelegates(context, resId);
if (drawable == null) {
drawable = createDrawableIfNeeded(context, resId);
}
if (drawable == null) {
drawable = ContextCompat.getDrawable(context, resId);
}
if (drawable != null) {
// Tint it if needed
drawable = tintDrawable(context, resId, failIfNotKnown, drawable);
}
if (drawable != null) {
// See if we need to 'fix' the drawable
DrawableUtils.fixDrawable(drawable);
}
return drawable;
}
因此,如果可以,此实例将尝试绘制资源,否则它将在版本中查找以获取资源。然后,如有必要,它甚至会着色。但是,此方法仅支持 API 7+。ContextCompat
所以我想决定你是否应该使用任何一个,
-
您是否必须支持 API 4、5 或 6?
- 是:别无选择,只能使用 或 。
ResourcesCompat
ContextCompat
- 否:继续转到#2。
-
您是否绝对需要提供自定义主题?
- 是:别无选择,只能使用
ResourcesCompat
- 否: 使用
AppCompatResources