查看这两种方法的源代码,它们看起来非常相似。如果没有向量,则可能会使用其中之一。
ResourcesCompat.getDrawable()将调用
Resources#getDrawable(int,theme)API 21或更高版本。它还支持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)。这意味着它将 不会
允许,如果设备不支持矢量绘图资源要绘制矢量绘图资源。但是,它将允许您传递主题。
同时,代码更改
AppCompatResources.getDrawable(Context context, intresId)最终可以实现以下目标:
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+。
所以我想决定是否应该使用其中之一,
您必须支持API 4、5或6吗?
- 是:别无选择,只能使用
ResourcesCompat
或ContextCompat
。 - 否:继续前进到第二名。
您是否绝对需要提供自定义主题?
是:别无选择,只能使用
ResourcesCompat
- 否:使用
AppCompatResources
- 是:别无选择,只能使用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)