Android: 选择器中禁用按钮的文本颜色没有显示?

120

我想制作一个带有选择器的按钮,我的按钮可以具有以下状态:

  • 启用/禁用
  • 按下/未按下

根据上述状态,我需要操纵按钮的:

  • 文本颜色
  • 背景图片

该按钮开始时处于禁用状态,因此它应该具有禁用的文本颜色和禁用的按钮背景。但是我看到的是默认的文本颜色(在样式中指定)和没有背景图像!

这是我的选择器button_selector.xml:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button" />    

    <item android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/button_pressed"/>

    <item android:state_pressed="true"
        android:state_enabled="false"
        android:textColor="#9D9FA2"
        android:drawable="@drawable/button"/>

    <item android:state_pressed="false"
        android:state_enabled="true"
        android:drawable="@drawable/button"/>    

</selector>

这是我的布局文件(layout.xml)中的按钮声明:

    <Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

最后这是我的样式(其中设置了默认的文本颜色)

<?xml version="1.0" encoding="utf-8"?>

 <resources>

     <style name="buttonStyle">
      <item name="android:textStyle">bold</item>
      <item name="android:textColor">#282780</item>
      <item name="android:textSize">18sp</item>
     </style>

</resources>

请帮忙!

5个回答

282

你还需要创建一个ColorStateList,用于标识不同状态下的文本颜色。

按照以下步骤进行操作:

  1. res\color中创建另一个XML文件,例如text_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- disabled state -->
  <item android:state_enabled="false" android:color="#9D9FA2" /> 
  <item android:color="#000"/>
</selector>
ењЁдҢ зљ„`style.xml`文件中пәЊжЊ‰з…§д»Өдё‹ж–№еәЏеә•з”Ё`text_color.xml`文件пәљ ``` ```
<style name="buttonStyle" parent="@android:style/Widget.Button">
  <item name="android:textStyle">bold</item>
  <item name="android:textColor">@color/text_color</item>
  <item name="android:textSize">18sp</item>
</style>

这应该可以解决你的问题。


1
如果您通过 @drawable/text_color 引用 text_color.xml 文件,那么难道您不需要将它保存在 /res/drawable(而不是 /res/color)目录中吗? - Erwan
1
@Erwan,感谢您的纠正。实际上,如果您查看编辑历史记录,我将其发布为drawable文件夹,但某个好心人将其编辑为颜色,但忘记在buttyStyle中更新为@color。现在已经更新了。 - Adil Soomro
8
除非我将text_color.xml放在drawable文件夹中,否则它无法编译(至少对我来说如此)。这需要将其称为@drawable/text_color - Al Lelopath
@mickey 是的,你说得对。所以如果你查看编辑历史记录,最初建议是在drawable文件夹中,但有人将其更新为color文件夹。我现在已经纠正了它。 - Adil Soomro
1
@D3LIC1OU5 如果你看评论,两种方法都被告知可以工作。我刚刚查阅了文档,color颜色状态列表资源的正确文件夹。欢迎你的编辑。 - Adil Soomro
显示剩余4条评论

12

1.在/res/文件夹中创建一个color文件夹,在color文件夹中创建一个xml文件:

text_color_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- disabled state --> 
    <item android:state_enabled="false" android:color="#776678" /> 
    <item android:color="#ffffff"/>
</selector>

2.现在创建一个xml布局:

 <Button
     android:id="@+id/button_search"
     android:layout_width="652dp"
     android:layout_height="48dp"
     android:layout_alignParentLeft="true"
     android:layout_alignParentTop="true"
     android:layout_marginTop="18dp"
     android:background="@android:color/transparent"
     android:text="Hello Bhaskar"
     android:textColor="@color/text_color_selector"/>  

4
最简单的解决方案是将颜色过滤器设置为按钮和背景图像,就像我在这里看到的那样。
您可以按照以下步骤操作:
if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

希望我能帮助到某些人…


这是一种很好的动态处理方式,当您没有预先设置按钮背景图像时使用。但是这并不能解决文本颜色的问题。 - Eran Goldin

0

你可以创建一个颜色列表

文件位置:

res/color/filename.xml

文件名将被用作资源ID。
资源引用:
在Java中:R.color.filename 在XML中:@[package:]color/filename 语法:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="hex_color"
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>

示例:

XML 文件保存在 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>

这个布局XML将会把颜色列表应用到一个视图中:

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

参考: 颜色列表参考


-1
<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

我在你的布局xml中看不到按钮被禁用。请将以下代码添加到你的按钮布局中。

android:enabled="false"

所以你的按钮布局将是:

<Button android:id="@+id/reserve_button"
        android:text="@string/reserve_button"
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"
        android:enabled="false"
        android:paddingRight="15dp"
        android:layout_gravity="left"
        style="@style/buttonStyle"
        android:background="@drawable/button_selector" />

@ Aqif Hamid 我在我的onCreate()方法中以编程方式执行button.setEnabled(false)。 - Nouran H

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