Android:选择器中禁用按钮的textColor没有显示?


98

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

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

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

  • 文字颜色
  • 背景图像

该按钮从被禁用开始,因此应该具有禁用的textColor和禁用的按钮背景。但是我可以看到默认的textColor(以样式指定)并且没有背景图片!

这是我的选择器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" />

最后这就是我的风格(设置了我的默认textColor)

<?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>

请帮忙!

Answers:


251

您还需要创建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>
  2. 在您的中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感谢您的纠正。实际上,如果您看到编辑历史记录,我会将其发布为可绘制的文件夹,并且一些好人将其编辑为彩色,但忘记将其更新为@colorbuttyStyle。现在更新。
Adil Soomro

5
text_color.xml除非我将其放在drawable文件夹中,否则它不会编译(至少对我而言),这要求将其称为@drawable/text_color
Al Lelopath

@mickey是的,您是正确的,因此,如果您看到编辑历史记录,最初建议将其显示在drawable中,但是有人将其更新为color文件夹,我现在对其进行了纠正。
Adil Soomro 2015年

1
@ D3LIC1OU5如果您查看注释,则两种方法都被告知可以工作。我只是参考了文档,并且color颜色状态列表资源的正确文件夹。欢迎您进行编辑。
Adil Soomro 2015年

7

1.在/ res /文件夹中创建一个颜色文件夹,并在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);

希望我能帮助某人...


当您没有预先的按钮背景图像时,这是动态执行此操作的好方法。但这并不能解决文本的颜色。
伊兰·戈尔丁

-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我以编程方式在onCreat()方法中执行button.setEnabled(false)
Nouran H 2012年

-1

您可以创建颜色列表

文件位置:

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

参考:颜色列表参考

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.