如何将按钮变灰?


103

我定义了一个按钮,如下所示。当我想禁用它时,我使用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>

Answers:


57

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

  1. 按下状态
  2. 默认状态
  3. 焦点状态
  4. 启用状态(具有错误指示的禁用状态;请参阅注释)

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

这是详细的讨论:具有不同颜色的标准Android Button


因此,为了使其变灰,我必须在禁用状态下更改背景的颜色和文本的颜色吗?有没有办法只是添加一个透明的前景?
2012年7

3
是的 您将提供的android:state_disable="true"内容将显示禁用按钮时的状态,这是一种简便且推荐的方法。
Adil Soomro 2012年

在哪里可以指定禁用状态的文本颜色?看来,只能指定一个背景......我要的那种了一个新问题:stackoverflow.com/questions/8743584/...
七月

17
没有android:state_disable="true",有吗?你指的是android:state_enabled="false"什么?
caw

@MarcoW:是的,你是绝对正确的。抱歉,属性错误。
Adil Soomro

171

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

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

更新:我是在菜鸟时代之前在Kotlin之前编写上述解决方案的。它更像是一种“快速而不肮脏”的解决方案,但我不建议在专业环境中使用它。

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

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

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


4
我读过,对setAlpha的调用在CPU上非常昂贵。谁能确认?
阿里·卡兹

@AliKazi取决于您的类型View。在这篇G +帖子中:“如果您的视图不包含重叠的绘制命令,setAlpha()则会对其进行优化,我们只需修改Paint对象以应用适当的Alpha。当View.hasOverlappingRendering()返回true 时会发生这种情况。s ImageViewTextViews无背景可绘制对象是此的常见候选对象优化。如果您处于这种情况,请setAlpha()根据需要使用尽可能多的东西。”
苏菲安

1
@Sufian谢谢。但是为了安全起见,我为每个按钮都依赖一个简单的StateListDrawable。我是怎么做到的,我已经发布了新答案。我提供了一些链接,这些链接指向我了解到alpha对性能不利的地方。
阿里·卡兹

视觉上对用户不友好
Farid

实际上在视觉上禁用了视图。感谢@Siavash
Akash Bisariya '19

54

最简单的解决方案是将滤色器设置为按钮的背景图像,正如我在此处看到的那样

您可以执行以下操作:

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

希望我能帮助某人...


我最喜欢这种方法。谢谢!
2014年

2
这种方法具有潜力,但最终的颜色并不总是您认为的那样。例如,与灰色相乘的橙色按钮会产生深红色,而不是褪色的橙色。
某处某人2015年

4
也许Mode.SRC_IN应该使用它而不是乘。参见stackoverflow.com/a/17112876/550471
某处某人2015年

可行

太棒了!好干净
米林·乔德哈里

21

所有给出的答案都可以正常工作,但是我记得学习过,使用setAlpha可能是个不好的主意在这里有更多信息)。因此,创建StateListDrawable是管理按钮的禁用状态的更好的主意。这是如何做:

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

<!-- Disable background -->
<item android:state_enabled="false"
      android:color="@color/md_blue_200"/>

<!-- Enabled background -->
<item android:color="@color/md_blue_500"/>

在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)OR时btnBlue.setEnabled(false),状态颜色将自动切换。


12

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

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

12

您应该为禁用按钮创建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>


1

我为此使用了此代码:

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

0

我尝试了上述解决方案,但似乎没有一种适合我。我选择了以下选项:

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