<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/drawablebtn_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

数据()中的Vuejs Html标签/属性

用于多个标签的 Python 正则表达式

Android Menu的基本用法

MyBatis的foreach标签与SUM函数同时使用