【问题标题】:How to grey out a button?如何使按钮变灰?
【发布时间】:2012-02-03 07:32:00
【问题描述】:

我有一个如下所示定义的按钮。当我想禁用它时,我使用my_btn.setEnabled(false),但我也想将它变灰。我该怎么做?

谢谢

<Button android:id="@+id/buy_btn" style="@style/srp_button" />

样式/srp_button

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_default</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">14sp</item>
    <item name="android:typeface">serif</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">30dp</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

drawable/btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/pink" />
    <corners android:radius="6dp" />
</shape>

【问题讨论】:

标签: android button


【解决方案1】:

您必须在 btn_defaut.xml 中提供 3 或 4 个状态作为选择器。

  1. 按下状态
  2. 默认状态
  3. 焦点状态
  4. 启用状态(带有错误指示的禁用状态;参见 cmets)

您将为状态提供相应的效果和背景。

这里有详细讨论:Standard Android Button with a different color

【讨论】:

  • 所以为了让它变灰,我必须改变背景颜色和禁用状态下的文本颜色?有没有办法只添加一个透明的前景?
  • 是的!您将为android:state_disable="true" 提供什么,它将显示按钮被禁用时的状态,这是一种简单且推荐的方式。
  • 在哪里可以指定禁用状态的文本颜色?似乎只能指定背景...我为此提出了一个新问题:stackoverflow.com/questions/8743584/…
  • 没有android:state_disable="true",是吗?你指的是android:state_enabled="false"吗?
  • @MarcoW.: 是的,你是绝对正确的。为错误的属性道歉。
【解决方案2】:
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);

【讨论】:

  • 这不能回答问题。
【解决方案3】:

将 Clickable 设置为 false 并将背景颜色更改为:

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));

【讨论】:

    【解决方案4】:

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

    你可以这样做:

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

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

    【讨论】:

    • 我最喜欢这种方法。谢谢!
    • 这种方法有潜力,但产生的颜色并不总是你想象的那样。例如,与灰色相乘的橙色按钮会产生深红色 - 而不是褪色的橙色。
    • 也许应该使用 Mode.SRC_IN 而不是乘法。见stackoverflow.com/a/17112876/550471
    • 这可行,但两种颜色混合后会变成另一种颜色
    • 太棒了!好干净。
    【解决方案5】:

    您还可以通过设置 alpha 使其显示为禁用(使其半透明)。如果您的按钮背景是图像,并且您不想为其创建状态,这将特别有用。

    button.setAlpha(.5f);
    button.setClickable(false);
    

    更新:我在 Kotlin 之前以及我还是菜鸟的时候就编写了上述解决方案。它更像是一个“快速”的解决方案,但我不建议在专业环境中使用它。

    今天,如果我想要一个可以在任何按钮/视图上运行而无需创建状态列表的通用解决方案,我会创建一个 Kotlin 扩展。

    fun View.disable() {
        getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
        setClickable(false)
    }
    

    在 Java 中,您可以使用静态 util 函数执行类似的操作,您只需将视图作为变量传递。它不是那么干净,但它可以工作。

    【讨论】:

    • 我读过调用 setAlpha 在 CPU 上的开销很大。谁能确认一下?
    • @AliKazi 这取决于您的View 的类型。来自this G+ post:“如果您的视图不包含重叠的绘图命令,则setAlpha() 将被优化掉,我们只需修改Paint 对象以应用适当的alpha。当View.hasOverlappingRendering() 返回true 时会发生这种情况。ImageViews 和@没有背景可绘制对象的 987654328@s 是此优化的常见候选对象。如果您处于这种情况,请尽可能多地使用 setAlpha()。"。
    • @Sufian 谢谢。但为了更安全,我为每个按钮使用了一个简单的 StateListDrawable。我是怎么做到的,我已经发布了一个新的答案。我已经包含了指向我了解到 alpha 对性能不利的链接。
    • 视觉上对用户不友好
    • 实际上在视觉上禁用了视图。谢谢@Siavash
    【解决方案6】:

    所有给定的答案都很好,但我记得知道使用 setAlpha 可以提高性能bad idea(更多信息here)。因此,创建StateListDrawable 是管理按钮禁用状态的更好主意。方法如下:

    在 res/drawable 文件夹中创建一个 XML btn_blue.xml:

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- Disable background -->
        <item android:state_enabled="false"
              android:color="@color/md_blue_200"/>
        
        <!-- Enabled background -->
        <item android:color="@color/md_blue_500"/>
    </selector>
    

    在 res/values/styles.xml 中创建按钮样式

    <style name="BlueButton" parent="ThemeOverlay.AppCompat">
          <item name="colorButtonNormal">@drawable/btn_blue</item>
          <item name="android:textColor">@color/md_white_1000</item>
    </style>
    

    然后将此样式应用于您的按钮:

    <Button
         android:id="@+id/my_disabled_button"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:theme="@style/BlueButton"/>
    

    现在当您调用btnBlue.setEnabled(true)btnBlue.setEnabled(false) 时,状态颜色会自动切换。

    【讨论】:

      【解决方案7】:

      您应该为禁用的按钮创建一个 XML 文件 (drawable/btn_disable.xml)

      <shape xmlns:android="http://schemas.android.com/apk/res/android">
          <solid android:color="@color/grey" />
          <corners android:radius="6dp" />
      </shape>
      

      并为按钮创建一个选择器(drawable/btn_selector.xml

      <selector xmlns:android="http://schemas.android.com/apk/res/android">
      
          <item android:drawable="@drawable/btn_disable" android:state_enabled="false"/>
          <item android:drawable="@drawable/btn_default" android:state_enabled="true"/>
          <item android:drawable="@drawable/btn_default" android:state_pressed="false" />
      
      </selector>
      

      将选择器添加到您的按钮

      <style name="srp_button" parent="@android:style/Widget.Button">
          <item name="android:background">@drawable/btn_selector</item>
      </style>
      

      【讨论】:

        【解决方案8】:

        我为此使用了这个代码:

        ColorMatrix matrix = new ColorMatrix();
        matrix.setSaturation(0);
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
        profilePicture.setColorFilter(filter);
        

        【讨论】:

          【解决方案9】:

          我尝试了上述解决方案,但它们似乎都不适合我。我选择了以下选项:

          <!-- button_color_selector.xml -->
          <selector xmlns:android="http://schemas.android.com/apk/res/android">
              <item android:color="@color/colorAccent" android:state_enabled="true"/>
              <item android:color="@color/colorAccentLight" android:state_enabled="false"/>
          </selector>
          
          <com.google.android.material.button.MaterialButton
                          android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:backgroundTint="@color/button_color_selector"
                          .../>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-18
            • 2019-05-23
            • 2023-03-18
            • 2011-04-14
            • 2020-04-21
            • 1970-01-01
            • 2020-08-17
            • 2016-08-16
            相关资源
            最近更新 更多