除了srcCompat的ImageView之外,如何在View中使用矢量可绘制对象?

令人眼花:乱:

app:srcCompatImageView允许向后兼容使用矢量可绘制对象。但是如何将它们与其他Views 一起使用ImageView例如,TextView属性如android:drawableLeft

同样使用vector drawable作为android:iconwith会MenuItem导致崩溃,但以下情况除外:

Fatal Exception: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
   at android.view.LayoutInflater.createView(LayoutInflater.java:626)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:470)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
   at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:621)
   at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:40)
   at android.support.v4.view.MenuItemCompat.setActionView(MenuItemCompat.java:310)
   at android.support.v7.view.SupportMenuInflater$MenuState.setItem(SupportMenuInflater.java:465)
   at android.support.v7.view.SupportMenuInflater$MenuState.addItem(SupportMenuInflater.java:479)
   at android.support.v7.view.SupportMenuInflater.parseMenu(SupportMenuInflater.java:196)
   at android.support.v7.view.SupportMenuInflater.inflate(SupportMenuInflater.java:118)
   at com.example.niceapp.context.main.MainActivity.onCreateOptionsMenu(MainActivity.java:101)
   at android.app.Activity.onCreatePanelMenu(Activity.java:2578)

使用支持库23.2.0,如何解决此问题?

彼得·达ň(PetrDaňa):

对于AppCompat版本23.3.0,其中没有通过选择器XML的工作解决方案(Razzledazzle可接受的答案),我们可以通过编程方式做到这一点:

activity_main.xml

<android.support.v7.widget.AppCompatImageButton
    android:id="@+id/btnEnter"
    />

MainActivity.java

AppCompatImageButton image = (AppCompatImageButton) findViewById(R.id.btnEnter);
if (image != null) {
    VectorDrawableCompat vcAccept = VectorDrawableCompat.create(getResources(), R.drawable.vc_accept, getTheme());
    VectorDrawableCompat vcAcceptWhite = VectorDrawableCompat.create(getResources(), R.drawable.vc_accept_white, getTheme());

    StateListDrawable stateList = new StateListDrawable();
    stateList.addState(new int[]{android.R.attr.state_focused, -android.R.attr.state_pressed}, vcAccept);
    stateList.addState(new int[]{android.R.attr.state_focused, android.R.attr.state_pressed}, vcAcceptWhite);
    stateList.addState(new int[]{-android.R.attr.state_focused, android.R.attr.state_pressed}, vcAcceptWhite);
    stateList.addState(new int[]{}, vcAccept);

    image.setImageDrawable(stateList);
}

此代码等效于此选择器xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/vc_accept" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" />
    <item android:drawable="@drawable/vc_accept" />
</selector>

更新

如果使用API​​ 23未显示矢量可绘制对象,则需要先将其转换VectorDrawable为常规Drawable如果要使用setCompoundDrawablesWithIntrinsicBounds,则需要执行此操作,但对于StateListDrawable,则不需要。

Drawable icon;
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
    icon = VectorDrawableCompat.create(getResources(), R.drawable.vc_icon, getContext().getTheme());
} else {
    icon = getResources().getDrawable(R.drawable.vc_icon, getContext().getTheme());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Android API下21中使用矢量可绘制对象?

如何为Android创建矢量可绘制对象?

Android矢量可绘制应用程序:srcCompat不显示图像

如何使用复合可绘制对象而不是包含ImageView和TextView的LinearLayout

如何在矢量可绘制图像中添加圆形边框?

Android:如何在可绘制的xml中使用当前主题的颜色?

如何使用设计支持库23.2实现动画矢量可绘制对象?

如何具有矢量可绘制对象的选择器?

具有矢量可绘制大小的ImageView

当可绘制资源是矢量可绘制对象时,如何通过TypedArray获取可绘制对象?

如何将多个矢量可绘制对象导入Android Studio项目

如何在Android中使用XML作为可绘制对象来创建自定义形状?

如何将PNG直接转换为Android矢量可绘制对象?

如何使用内部路径透明创建可绘制的矢量?

如何在styles.xml中设置矢量可绘制对象

如何在资源中使用int数组中的可绘制对象

如何在Kotlin中使用带有URL的复合可绘制对象设置TextView,该URL图像已加载Glide?

生成ImageView可绘制对象的缩放版本

如何在Android Studio中使用AsyncTask从可绘制对象设置图像

如何在可绘制文件(如矢量文件)中使用资源文件

ImageView,如何以编程方式获取可绘制对象的getSrc?

如何在异步函数之外设置var以在$ scope对象中使用

Android - 在支持最低 API 级别 20 或更低级别的应用程序中使用矢量可绘制对象有什么优势?

除了谷歌自定义搜索之外,如何在我的所有表格中使用表格 CSS 属性?

如何在 Java 代码中获得可绘制的矢量选择器

如何扩展矢量可绘制?

如何在android中使用动画矢量

如何在 Python 中使用除了 AssertionError 之外的 while 循环继续工作

如何在 Dart 中使用括号创建可迭代对象?