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)
提前致谢!
最后,发现了问题.android [pre-lollipop]操作系统中有一个错误,它不允许你在drawable中使用attr.这是bug的链接:
Android开发团队发布了一个修复程序,但它适用于Android L及更高版本.有关此问题的解决方法,请参阅以下解决方案:
我遇到了同样的问题,截至 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)
希望能帮助到你!!
| 归档时间: |
|
| 查看次数: |
5642 次 |
| 最近记录: |