Android Selector Drawable不适用于属性

mud*_*dit 7 android drawable selector-drawable

我正在使用attr为我的项目创建一个可绘制的选择器,这样一旦我改变主题颜色,我就不必对可绘制文件进行任何更改.我正在使用以下libs:

compile 'com.android.support:appcompat-v7:+'
compile 'com.android.support:cardview-v7:+'
compile 'com.android.support:design:22.2.0'
Run Code Online (Sandbox Code Playgroud)

这是drawable的源代码:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="?attr/colorPrimary" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="?attr/colorPrimaryDark" android:state_pressed="true"/>
    <item android:drawable="@android:color/darker_gray" android:state_enabled="false"/>
    <item android:drawable="?attr/colorPrimary"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

在这个相同的代码中,如果我用colors.xml文件中定义的颜色替换属性,同样的drawable工作.

样本可绘制颜色:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/color_primary" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="@color/color_primary_dark" android:state_pressed="true"/>
    <item android:drawable="@android:color/darker_gray" android:state_enabled="false"/>
    <item android:drawable="@color/color_primary"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

提前致谢!

mud*_*dit 7

最后,发现了问题.android [pre-lollipop]操作系统中有一个错误,它不允许你在drawable中使用attr.这是bug的链接:

https://code.google.com/p/android/issues/detail?id=26251

Android开发团队发布了一个修复程序,但它适用于Android L及更高版本.有关此问题的解决方法,请参阅以下解决方案:

如何从drawable引用样式属性?


Pol*_*Pol 7

我遇到了同样的问题,截至 2019 年尚未解决,因此您不能在选择器中将属性引用为可绘制对象。我将分享我为该问题获得的解决方案,因为我没有看到它在这里发布。我在mudit 在他的回答中也提到的错误报告的最后一条评论中找到了它。

解决方法基本上是创建一个可绘制资源,该资源将成为引用属性值的资源。

为了说明您的情况,解决方案将改为:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="?attr/colorPrimary" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="?attr/colorPrimaryDark" android:state_pressed="true"/>
    <item android:drawable="@android:color/darker_gray" android:state_enabled="false"/>
    <item android:drawable="?attr/colorPrimary"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

您可以将 ?attr/* 替换为可绘制资源:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/colorPrimaryDrawable" android:state_enabled="true" android:state_window_focused="false"/>
    <item android:drawable="@drawable/colorPrimaryDarkDrawable" android:state_pressed="true"/>
    <item android:drawable="@android:color/darker_gray" android:state_enabled="false"/>
    <item android:drawable="@drawable/colorPrimaryDrawable"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

可绘制对象将被定义为:

drawable/colorPrimaryDrawable

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
    <solid android:color="?attr/colorPrimary" />
</shape>
Run Code Online (Sandbox Code Playgroud)

drawable/colorPrimaryDarkDrawable

<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">
    <solid android:color="?attr/colorPrimaryDark" />
</shape>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!!