【问题标题】:Android: textColor of disabled button in selector not showing?Android:选择器中禁用按钮的 textColor 未显示?
【发布时间】:2012-06-28 19:45:54
【问题描述】:

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

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

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

  • 文字颜色
  • 背景图片

按钮从我被禁用开始,因此它应该具有禁用的 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>

请帮忙!

【问题讨论】:

    标签: android xml button selector background-image


    【解决方案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 中看不到您的按钮的 diabling。将此添加到您的按钮布局中。

    android:enabled="false"
    

    所以您的 Button 布局将是,

    <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)
    【解决方案2】:

    您还需要为标识不同状态的文本颜色创建一个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>
      

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

    【讨论】:

    • 如果您通过@drawable/text_color 引用它,您不需要将text_color.xml 文件保存在/res/drawable(而不是/res/color)中吗?
    • @Erwan 感谢您的指正。实际上,如果您看到编辑历史记录,我将其发布为可绘制文件夹,并且一些好人将其编辑为颜色,但忘记在 buttyStyle 中将其更新为@color。现在更新了。
    • text_color.xml 不会编译(至少对我而言),除非我将它放在 drawable 文件夹中,需要将其称为 @drawable/text_color
    • @mickey 是的,你是对的,所以如果你看到编辑历史记录,它最初是在 drawable 中建议的,但是有人将它更新到颜色文件夹,我现在已经纠正了。
    • @D3LIC1OU5 如果您查看 cmets,则已告知两种方式都可以工作。我刚刚查阅了文档,colorColor State List Resource 的正确文件夹,欢迎您进行编辑。
    【解决方案3】:

    最简单的解决方案是为我看到here的按钮的背景图像设置颜色过滤器

    你可以这样做:

    if ('need to set button disable')
        button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
    else
        button.getBackground().setColorFilter(null);
    

    希望我能帮助到某人...

    【讨论】:

    • 当您事先没有按钮背景图像时,这是动态执行此操作的好方法。但这不考虑文本颜色。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      您可以创建一个颜色列表

      文件位置:

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

      参考:Color List Reference

      【讨论】:

        猜你喜欢
        • 2019-07-28
        • 2014-03-23
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多