安卓按钮背景颜色不同

40
我想使用一个选择器XML文件来改变按钮的背景颜色。我的方法基本上与这个页面底部的例子相同:http://developer.android.com/guide/topics/resources/color-list-resource.html
我有一个名为res/color/button_text.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="#ffff0000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#ff0000ff"/> <!-- focused -->
    <item android:color="#ff000000"/> <!-- default -->
</selector>

我的布局包含以下代码:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/button_text"
    **android:background="@color/button_text"** /> 

这段代码会导致崩溃,错误提示为“二进制XML文件第4行标签需要'drawable'属性或定义drawable的子标签”。但是如果我按照上面的链接使用android:textColor,则可以正常工作。因此,问题必须是背景问题。如果不是必要的话(基本上我只需要一个可点击的矩形,所以我使用带有彩色背景的按钮),我不想创建一个9patch-png。


Konstantin的回答有一个错别字 - item android:color="@color/black" 这一行..........我建议应该改为 item android:drawable="@color/black" ........... - user609727
https://dev59.com/CG865IYBdhLWcg3wTczg#15880688 - Fakhar
4个回答

84

正如你的错误提示所述,你必须为项目定义drawable属性(出于某种原因,在背景定义中需要此属性),因此:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@color/red"/> <!-- pressed -->
    <item android:state_focused="true" android:drawable="@color/blue"/> <!-- focused -->
    <item android:drawable="@color/black"/> <!-- default -->
</selector>

还要注意,drawable属性不接受原始颜色值,因此必须将颜色定义为资源。在res/values文件夹中创建colors.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <color name="black">#000</color>
     <color name="blue">#00f</color>
     <color name="red">#f00</color>
</resources>

5
项目 android:color="@color/black" 应更改为项目 android:drawable="@color/black"。 - Noah
现在,您可以在按钮属性中使用 style="@style/Widget.AppCompat.Button.Colored" 了!更多信息请参见:https://dev59.com/Bl8d5IYBdhLWcg3wkS0V - David Velasquez

31
在你提供的URL中,button_text.xml被用来设置textColor属性。这就是为什么他们把button_text.xml放在res/color文件夹中,并且使用了@color/button_text.xml的原因。
但是,你正试图将它用于background属性。background属性会在res/drawable文件夹中寻找东西。
检查一下,我从互联网上获取了这个自定义按钮的选择器,没有链接,但我感谢作者。它帮助了我。将其放在drawable文件夹中。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <gradient
                android:startColor="@color/yellow1"
                android:endColor="@color/yellow2"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item android:state_focused="true" >
        <shape>
            <gradient
                android:endColor="@color/orange4"
                android:startColor="@color/orange5"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

    <item>        
        <shape>
            <gradient
                android:endColor="@color/white1"
                android:startColor="@color/white2"
                android:angle="270" />
            <stroke
                android:width="3dp"
                android:color="@color/grey05" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>

</selector>

我在主xml布局中这样使用它

<Button android:id="@+id/button1"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="150dip"
            android:layout_marginLeft="45dip"
            android:textSize="7pt"
            android:layout_height="wrap_content"
            android:layout_width="230dip"
            android:text="@string/welcomebtntitle1"
            android:background="@drawable/custombutton"/>

希望这可以帮助到你。Vik是正确的。

编辑:这里是colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="yellow1">#F9E60E</color>
   <color name="yellow2">#F9F89D</color>
   <color name="orange4">#F7BE45</color>
   <color name="orange5">#F7D896</color>
   <color name="blue2">#19FCDA</color>
   <color name="blue25">#D9F7F2</color>
   <color name="grey05">#ACA899</color>
   <color name="white1">#FFFFFF</color>
   <color name="white2">#DDDDDD</color>
</resources>

你有与此相对应的color.xml文件吗? - electrichead
@electrichead - 是的,我有它。我正在编辑我的答案,请查看。 - Sreeram
我第一次看到这个答案是在开始使用Android时,当时我被大量的XML代码吓到了,但两个月后我又遇到了它,这是一个很好的解决方案,可以创建自定义按钮颜色,而不需要使用图像。 - Stephen Hosking
这个答案比另一个答案完整得多,谢谢!在我的情况下,我删除了<stroke>。 - Rudolf Real

4
您需要将selector.xml文件放在drawable文件夹中。 然后写入: android:background="@drawable/selector"。 这样可以处理按下和聚焦状态。

2
在Mono Android中,您可以使用以下过滤器:
your_button.Background.SetColorFilter(new Android.Graphics.PorterDuffColorFilter(Android.Graphics.Color.Red, Android.Graphics.PorterDuff.Mode.Multiply));

背景应该读取getbackground()。另一个选项是使用过滤器,例如:myButton.getBackground().setColorFilter(new LightingColorFilter(multiplier, bckgrd_color)); - hornetbzz

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