我对这两个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+。

    所以我想决定是否应该使用其中之一,
  • 您是否必须支持API 4、5或6?
  • 是:只能使用ResourcesCompatContextCompat
  • 否:继续执行#2。
  • 您是否绝对需要提供自定义主题?
  • 是:别无选择,只能使用ResourcesCompat
  • 否:使用AppCompatResources
  • 10-04 12:47