<item>标签需要一个'drawable'属性

8

我正在尝试非常简单地样式化一个Button。 我只想在没有被按下时使它变蓝色并带有文本,在被点击时让它变成白色并带有蓝色文本。

我尝试使用样式和选择器来实现这一点。

在我的布局中,我有这个Button

 <Button
    android:id="@+id/button1"
    style="@style/MyButton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    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>

我现在无论运行应用程序还是打开布局编辑器都会出现以下错误:

<item>标记需要一个“drawable”属性

我理解这个消息,但我没有一个drawable,只是一个简单的平面按钮。
那么我该如何创建这样一个简单的按钮? 更新: 根据这篇文章,它应该可以工作。

创建一个基本的shape可绘制对象,只指定solid属性,设置为目标颜色。http://developer.android.com/guide/topics/resources/drawable-resource.html#Shape - user
2
@Luksprog 好了,现在它可以工作了,但我们都不认为我必须创建5个XML文件才能更改按钮的“活动”颜色和背景这一点是疯狂的吗?一定有更好的方法... - Bart Friederichs
看看Dynamo的答案。 - user
3个回答

24

尝试这种方式,希望能帮助您解决问题。

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>

7
这是正确的,以下是它为什么有效的原因:视图的背景需要某种类型的“Drawable”。通常情况下,颜色资源是有效的“Drawable”。然而,如果您使用状态列表,则解析器似乎会在查找背景时检查项目上是否有可绘制属性。这就是为什么“android:textColor”可以指向必须具有“android:color”的选择器,“android:background”必须指向包含“android:drawable”的选择器的原因。因为颜色资源是有效的“Drawable”,所以您可以像往常一样使用“android:drawable = @color / ...”。 - karl
@HareshChhelana 怎样才能像 #ffffff 这样使用哈希值来编写 android:color? - Erum
最新的Android版本似乎允许使用颜色选择器作为背景。 - deviant

3
  • 背景属性需要一个可绘制对象,并且可绘制对象选择器必须在 /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>

2

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 是一个普通的颜色选择器。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接