2017 年 10 月 22 日更新
正如@user924 所指出的,现在AppCompatDrawableManager 访问仅限于其自己的库。
ContextCompat.getDrawable(...) 应该可以解决问题。
2016 年 5 月 9 日更新
正如@kirill-kulakov 在其回答中所指出的,支持库的最新更新将 TintContextWrapper 的可见性限制在它自己的包中。
我正在更新我的答案以删除不正确的代码,但请感谢 Kirill 的更正!
VectorDrawable 和 RemoteViews pre-Lollipop
您可以通过简单的hack避免添加矢量可绘制资源的替代光栅化版本:使用 AppCompat TintResources 到 TintContextWrapper 使用 AppCompatDrawableManager 使用 ContextCompat。
TintResources AppCompatDrawableManager ContextCompat 是除其他外,在Lollipop 之前的设备,解析 VectorDrawable 的 XML 文件并将它们转换为可一直使用到 API 7 的 VectorDrawableCompat 实例。
然后,一旦你有一个 VectorDrawableCompat 实例,将它光栅化到一个位图上。稍后您将在远程 ImageView 中使用此位图。
开始之前:AppCompat 库
确保您使用的是 Android Studio 2.0+ 并已将您的应用 build.gradle 文件配置如下:
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.3.0'
}
更新您的 AppWidgetProvider
首先:不要在 RemoteViews 布局文件中设置矢量可绘制资源(android:src 和 app:srcCompat 都不起作用)。您必须以编程方式设置它们。
在您的 AppWidgetProvider 类中,根据 API 级别设置矢量资源或光栅化版本:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.appwidget_layout);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
remoteViews.setImageViewResource(R.id.imageView, R.drawable.vector);
} else {
Drawable d = ContextCompat.getDrawable(context, R.drawable.vector);
Bitmap b = Bitmap.createBitmap(d.getIntrinsicWidth(),
d.getIntrinsicHeight(),
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
d.setBounds(0, 0, c.getWidth(), c.getHeight());
d.draw(c);
remoteViews.setImageViewBitmap(R.id.imageView, b);
}
参考文献