我对这两个API感到有些困惑。
ResourcesCompat.getDrawable(Resources res, int id, Resources.Theme theme)
AppCompatResources.getDrawable(Context context, int resId)
问题
(除了 vector 通货膨胀)?
最佳答案
查看这两种方法的源代码,它们看起来非常相似。如果没有 vector ,则可能会使用其中之一。
ResourcesCompat.getDrawable()
将在API 21或更高版本上调用Resources#getDrawable(int, theme)
。它还支持Android API 4+。仅此而已:
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);
}
}
其中
ResourcesCompatApi21
仅调用res.getDrawable(id, theme)
。这意味着如果设备不支持 vector 可绘制对象,则将不允许绘制 vector 可绘制对象。但是,它将允许您传递主题。同时,
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;
}
因此,此实例将尝试绘制资源(如果可以),否则它将在
ContextCompat
版本中查找以获取资源。然后,如果有必要,它甚至会对其进行着色。但是,此方法仅支持API 7+。所以我想决定是否应该使用其中之一,
ResourcesCompat
或ContextCompat
。 ResourcesCompat
AppCompatResources