如何在 Java 代码中获取可绘制的矢量选择器
How to get vector selector drawable in Java code
我在 xml 中使用了可绘制的矢量选择器,效果很好,但当 sdk < 21 时 Java 代码崩溃了。
这是我的 xml 用法:
<android.support.v7.widget.AppCompatTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/common_selector_ic_back"/>
common_selecor_ic_back.xml
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/common_ic_back" />
</selector>
common_ic_back.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
但是我想在代码中更改drawableLeft,我尝试了三种解决方案,都失败了。
1
Drawable d1 = getResources().getDrawable(R.drawable.common_selector_ic_back);
因
而崩溃
android.content.res.Resources$NotFoundException: File
res/drawable/common_selector_ic_back.xml from drawable resource ID
0x7f080065
2
icon2 = AppCompatResources.getDrawable(this, R.drawable.common_selector_ic_back);
失败,原因相同
3
VectorDrawableCompat.create(context.getResources(), R.drawable.common_selector_ic_back, context.getTheme());
日志失败
Binary XML file line #2 tag requires viewportWidth > 0
有人遇到问题吗?你能告诉我如何在硬件代码中获得可绘制的矢量选择器吗?
解法:
activity必须是AppCompatActivity
解决方案:尝试以下步骤:
首先,将这一行添加到您的 common_ic_back.xml
<vector
...
android:tintMode="multiply"
...>
......
......
</vector>
然后,不要忘记添加 build.gradle(Module:app)
否则该方法将不适用于旧的 Android 版本。
defaultConfig {
....
vectorDrawables.useSupportLibrary = true
....
}
最后,在 activity
class 中,在 onCreate()
之前使用此矢量添加:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
试试吧。希望能帮助到你。如有疑问请评论。
将 Activity 更改为扩展 AppCompatActivity
我在 xml 中使用了可绘制的矢量选择器,效果很好,但当 sdk < 21 时 Java 代码崩溃了。
这是我的 xml 用法:
<android.support.v7.widget.AppCompatTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/common_selector_ic_back"/>
common_selecor_ic_back.xml
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/common_ic_back" />
</selector>
common_ic_back.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
但是我想在代码中更改drawableLeft,我尝试了三种解决方案,都失败了。
1
Drawable d1 = getResources().getDrawable(R.drawable.common_selector_ic_back);
因
而崩溃android.content.res.Resources$NotFoundException: File res/drawable/common_selector_ic_back.xml from drawable resource ID
0x7f080065
2
icon2 = AppCompatResources.getDrawable(this, R.drawable.common_selector_ic_back);
失败,原因相同
3
VectorDrawableCompat.create(context.getResources(), R.drawable.common_selector_ic_back, context.getTheme());
日志失败
Binary XML file line #2 tag requires viewportWidth > 0
有人遇到问题吗?你能告诉我如何在硬件代码中获得可绘制的矢量选择器吗?
解法:
activity必须是AppCompatActivity
解决方案:尝试以下步骤:
首先,将这一行添加到您的 common_ic_back.xml
<vector
...
android:tintMode="multiply"
...>
......
......
</vector>
然后,不要忘记添加 build.gradle(Module:app)
否则该方法将不适用于旧的 Android 版本。
defaultConfig {
....
vectorDrawables.useSupportLibrary = true
....
}
最后,在 activity
class 中,在 onCreate()
之前使用此矢量添加:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
试试吧。希望能帮助到你。如有疑问请评论。
将 Activity 更改为扩展 AppCompatActivity