<item> 标签需要 'drawable' 属性
Posted
技术标签:
【中文标题】<item> 标签需要 \'drawable\' 属性【英文标题】:<item> tag requires a 'drawable' attribute<item> 标签需要 'drawable' 属性 【发布时间】:2013-09-20 09:53:55 【问题描述】:我正在尝试非常简单地设置Button
的样式。我只希望它在未按下时带有蓝色文字,并在单击时带有蓝色文字。
我尝试使用样式和选择器来做到这一点。
在我的布局中我有这个Button
:
<Button
android:id="@+id/button1"
style="@style/MyButton"
android:layout_
android:layout_
android:layout_weight="1"
android:text="@string/login" />
在res/values/styles
我有这个styles.xml
:
<style name="MyButton">
<item name="android:background">@drawable/btn_background</item>
<item name="android:textColor">@drawable/btn_textcolor</item>
</style>
当然还有res/drawable
、btn_background.xml
中的两个选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:color="@color/white" />
<item android:color="@color/SapphireBlue" />
</selector>
和btn_textcolor.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:color="@color/SapphireBlue" />
<item android:color="@color/white" />
</selector>
我现在运行应用程序或打开布局编辑器时遇到的错误是:
- 标签需要 'drawable' 属性
我了解该消息,但我没有有可绘制对象,它是一个简单的平面按钮吗?
我怎样才能创建这样一个简单的按钮?
更新根据this post,应该可以了。
【问题讨论】:
创建一个基本的shape
drawable,只指定solid
属性,设置为您的目标颜色。 developer.android.com/guide/topics/resources/…
@Luksprog 好的,它现在可以工作了,但我们不都同意这是 疯狂 我必须创建 5 个 XML 文件只是为了更改按钮的“活动”颜色和背景?一定有更好的办法......
看看 Dynamo 的回答。
【参考方案1】:
试试这个方法,希望能帮助你解决问题。
btn_background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white" android:state_pressed="true"></item>
<item android:drawable="@drawable/white" android:state_focused="true"></item>
<item android:drawable="@drawable/SapphireBlue" android:state_enabled="true" android:state_focused="false" android:state_pressed="false"></item>
<item android:drawable="@drawable/white" android:state_enabled="false"></item>
</selector>
btn_textcolor.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/SapphireBlue" android:state_pressed="true"></item>
<item android:color="@drawable/SapphireBlue" android:state_focused="true"></item>
<item android:color="@drawable/white" android:state_enabled="true" android:state_focused="false" android:state_pressed="false"></item>
<item android:color="@drawable/SapphireBlue" android:state_enabled="false"></item>
</selector>
【讨论】:
这是正确的,这就是它看起来起作用的原因:视图的背景需要某种Drawable
。通常,颜色资源是有效的可绘制对象。但是,如果您使用状态列表,则解析器会在查找背景时检查项目上的可绘制属性。这就是为什么android:textColor
可以指向具有(并且必须具有)android:color
的选择器,而android:background
必须指向包含android:drawable
的选择器的原因。因为颜色资源是有效的可绘制对象,所以您可以像往常一样使用android:drawable=@color/...
。
@HareshChhelana 我如何使用 #ffffff 等哈希值编写 android:color
看起来最新的安卓版本允许使用颜色选择器作为背景【参考方案2】:
Background 属性需要一个可绘制对象,并且可绘制选择器必须位于 /drawable 文件夹之一中。
TextColor 属性需要一种颜色,并且颜色选择器必须位于 /color 文件夹之一中。
/res/color/my_textcolor_selctor.xml
/res/drawable/my_background_selector.xml
此外,可绘制选择器必须对选择器项使用“android:drawable”(颜色资源可能用于属性值,因为颜色是可绘制的), 而颜色选择器必须使用 'android:color' 作为选择器项。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="@color/disabledbackgroundColor" />
<!-- default -->
<item android:drawable="@color/myBackgroundColor" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:color="@color/disabledColor" />
<!-- default -->
<item android:color="@color/defaultColor" />
</selector>
【讨论】:
【参考方案3】:android:background
似乎接受可绘制选择器但不接受颜色选择器...所以只需留下一个颜色作为您的android:background
,并使用带有 android:backgroundTint 的普通颜色选择器,它无论如何都需要颜色:
在styles.xml:
<style name="MyButton">
<item name="android:background">@color/some_fixed_color</item>
<item name="android:backgroundTint">@color/background_color_selector</item>
<item name="android:textColor">@drawable/btn_textcolor</item>
</style>
(res/color/background_color_selector.xml
是一个普通的颜色选择器。)
【讨论】:
以上是关于<item> 标签需要 'drawable' 属性的主要内容,如果未能解决你的问题,请参考以下文章
Js2XML 在转换为 XML 时返回了额外的“item”标签
vue里面select标签 添加默认选项<option v-for="item in email" :value="'@'+item"&g