我正在使用Support Library 23.2中添加的支持向量drawable和AppCompat。我使用app:srcCompat
和StateListDrawable
内的矢量绘图,因此我可以将android:drawableLeft
用于我的TextView。
自升级到AppCompat的23.3.0版本以来,只有app:srcCompat
中的向量正在运行。每当我以其他方式引用它时
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package.name/.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class Button
...
Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class Button
...
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #14: invalid drawable tag vector
at android.graphics.d
现在改变了什么导致我的支持向量drawables在某些情况下失败了?
答案 0 :(得分:40)
更新:他们在支持库23中再次启用它:
对于AppCompat用户,我们添加了一个选择性API,通过AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)重新启用资源支持Vector Drawables(23.2中的行为); - 请记住,这仍然会导致内存使用问题和更新配置实例的问题,因此默认情况下会禁用它。
检查this link: 23.4.0 available now
-------------------------------------------------- ---------
根据release announcement for Android Support Library 23.3:
对于AppCompat用户,由于版本23.2.0 / 23.2.1 [https://code.google.com/p/android/issues/detail?id=205236中的实现中发现的问题,我们决定删除允许您使用Lollipop前设备上的资源使用矢量绘图的功能。 ,https://code.google.com/p/android/issues/detail?id=204708]。使用
app:srcCompat
和setImageResource()
继续有效。
所以这是预期的行为改变。对于srcCompat
未处理的任何案例,您必须使用非矢量图形。
如果您希望在API 21之前继续使用向量,可以删除该行
vectorDrawables.useSupportLibrary = true
(如果您使用23.2 blog post中显示的1.5 Gradle插件,则相当于。)
这将导致Android Studio在编译时为API 21以上设备上的向量使用minSdkVersion低于API 21的应用生成PNG,允许您保留与23.2.1
相同的代码,但代价是额外的APK大小。
答案 1 :(得分:16)
支持库23.2.0中添加了对前Lollipop的VectorDrawable支持,然后在23.3.0中部分删除。在23.4.0及更高版本(至少25.1.0)中,删除的部分返回但在可选标志后面(因为它带有价格)。
总结:在支持库23.4.0中至少25.1.0,您可以让VectorDrawable在某些情况下 。
我已this diagram提供帮助。
答案 2 :(得分:4)
使用vector作为compoundDrawables(例如textview)而不使用
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
导致记录的高内存使用率,只需使用
对文件进行充气Drawable drawable = AppCompatResources.getDrawable( getContext(), R.drawable.vector_resID );
if( drawable != null ) drawable.setBounds( 0, 0, iconSize, iconSize );
TextViewCompat.setCompoundDrawablesRelative( textView, null, null, drawable, null);
这是navDrawer的工作方式