以编程方式设置Android按钮背景

56

我想知道如何通过编程设置按钮的颜色? 我编写了以下代码,但失败了:

Button11.setBackgroundColor(R.color.red);

谢谢!!


2
你想要什么效果?一个纯红色的矩形,没有其他效果吗?如果不是,你需要一些可绘制的东西来实现你想要的效果,可以是PNG(9patch)或在XML中定义的其他内容。系统没有内置的方法来创建一个看起来像普通按钮但颜色不同的按钮。除非你只是想要一个纯色的矩形,否则你必须提供自己的资源。 - FoamyGuy
实际上我正在做的是,在一个有12个按钮的表格中,程序会随机选择其中6个按钮来填写定义好的文本。我希望这6个按钮可以变成另一种不同的颜色。在这方面,它不能在xml部分完成,而只能用编程方式实现。我已经定义了一些xml(首先未选择的是普通的绿色圆形颜色,如果被选中,我希望它变成红色圆形颜色)。如果按这种方式,它能做到吗? - pearmak
2
正确,但你需要拥有一个类似于9patch png的红色按钮图像,或者你需要在xml中定义一个红色按钮的形状。如果你只是将背景颜色改为红色,那么你最终会得到一个普通的红色矩形而不是看起来像正常按钮的东西。 - FoamyGuy
是的,你说得对。我已经进行了修改,但它只会显示一个红色的矩形,甚至无法被按下!我已经单独定义了red_button_xml,但如何将其合并到Activity中呢?非常感谢! - pearmak
1
你应该使用Button.setBackgroundResource()而不是setBackgroundColor() - FoamyGuy
android:backgroundTint="@color/button_background_color" https://www.geeksforgeeks.org/how-to-change-the-background-color-of-button-in-android-using-colorstatelist/安卓:backgroundTint =“@color/button_background_color” https://www.geeksforgeeks.org/how-to-change-the-background-color-of-button-in-android-using-colorstatelist/ - Snostorp
11个回答

107

R.color.red是一个ID(也是一个int),但不是颜色。

请使用以下其中之一:

// If you're in an activity:
Button11.setBackgroundColor(getResources().getColor(R.color.red));
// OR, if you're not: 
Button11.setBackgroundColor(Button11.getContext().getResources().getColor(R.color.red));

或者,作为替代方案:

Button11.setBackgroundColor(Color.RED); // From android.graphics.Color

或者,对于更专业的技能:

Button11.setBackgroundColor(0xFFFF0000); // 0xAARRGGBB

我如何为通过编程创建的多个按钮设置不同的颜色? - iSrinivasan27
7
但它会清除所有样式,例如边框或圆角。因此,它实际上为按钮区域设置颜色,而不是像 OP 请求的按钮颜色。 - Leos Literak
5
考虑到getColor()现在已经被弃用,建议使用ContextCompat。参考链接:https://dev59.com/HlwZ5IYBdhLWcg3wVO9U#32149275 - Alwin Kesler

49

虽然是旧帖,但我学到了新东西,希望这能帮助到某些人。

如果您想更改背景颜色但保留其他样式,那么以下内容可能会有所帮助。

button.getBackground().setColorFilter(ContextCompat.getColor(this, R.color.colorAccent), PorterDuff.Mode.MULTIPLY);

setColorFilter 只会为现有的背景设置色调,而不会设置新的背景颜色。 - Anshu Dwibhashi
9
如果您正在使用材料设计风格的凸起按钮,那么这就是有效的方法。不要使用 Button.setBackgroundColor() - fahmy
1
现在已经是2017年了,为了从资源中设置颜色,仍然需要编写这么多的样板代码,真是太丑陋了... - Leo DroidCoder
为什么要使用 PorterDuff.Mode.MULTIPLY 而不是 PorterDuff.Mode.SRC?前者不会只是与现有颜色混合吗? - Anigif

9

2020年及以后,您所需要的答案是:

  • setColorFilter(color, mode) 自API 29起已经停用请参考这里)。
  • button.setBackgroundColor(color) 会影响按钮的样式。

现在设置按钮颜色的正确方法是使用BlendModeColorFilter()请参阅文档)。

用法:

btn.background.colorFilter = BlendModeColorFilter(color, BlendMode.MULTIPLY)

如果你也使用较老的API:

fun setButtonColor(btn: Button, color: Int) {
    if (Build.VERSION.SDK_INT >= 29)
        btn.background.colorFilter = BlendModeColorFilter(color, BlendMode.MULTIPLY)
    else
        btn.background.setColorFilter(color, PorterDuff.Mode.MULTIPLY)
}

请投票以帮助他人找到这个答案 - 我花了相当长的时间才弄清楚 ^^

你的方法只有在按钮的原始颜色为白色时才能起作用。这是因为MULTIPLY方法考虑了源颜色。 - stillwaiting
这个可以工作,但如果您在xml中使用style=?android:attr/borderlessButtonStyle来设置按钮样式,则无法正常工作。 - Hmerman6006
这对我不起作用!它仍然使用在styles.xml中设置的默认颜色。 - Renjith

6
您可以通过编程来设置按钮的颜色,例如:
Button11.setBackgroundColor(Android.Graphics.Color.parseColor("#738b28"));

此外,您也可以为按钮设置文本颜色,例如:
Button11.setTextColor(Android.Graphics.Color.parseColor("#FFFFFF"));

1
btn.setBackgroundColor(Color.parseColor("#97a0ad")); 也可以工作。 - lechat

3

我发现当我尝试执行以下操作时,Android Studio会给我一个警告,说getColor()已被弃用:

Button11.setBackgroundColor(getResources().getColor(R.color.red))

我发现以下方法是一个简单、最新的解决方案:

Button11.setBackgroundColor(ContextCompat.getColor(context, R.color.red))

在编写代码时,应避免硬编码颜色参数,因为这被认为是不良的代码风格。

编辑:在使用setBackgroundColor()自定义按钮后,我发现内部按钮填充扩展了。我找不到任何方法将其改回高度和宽度都设置为"wrap_content"。也许这是一个bug。

来源: https://dev59.com/LFwZ5IYBdhLWcg3wG9F_#32202256


1

为了在设置背景颜色时不改变按钮的大小:

button.getBackground().setColorFilter(button.getContext().getResources().getColor(R.color.colorAccent), PorterDuff.Mode.MULTIPLY);

这不会改变按钮的大小,也适用于旧版安卓系统。

1

根据@finnmglas的进一步说明,截至2021年,Java的答案如下:

    if (Build.VERSION.SDK_INT >= 29)
        btn.getBackground().setColorFilter(new BlendModeColorFilter(color, BlendMode.MULTIPLY));
    else
        btn.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY);

1
使用 setBackgroundColor() 会影响样式。因此,需要针对之前的按钮声明一个具有相同属性但颜色不同的新样式。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/green"/>
<corners android:radius="10dp"/>
</shape>

现在,使用OnClick方法。
location.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            location.setBackgroundResource(R.drawable.green);

        }
    });

这会改变按钮,但与更改背景看起来类似。

0
你可以使用以下代码来设置按钮的颜色,而不会影响任何已使用的样式。
 yourbtnid.background.setColorFilter(ContextCompat.getColor(context, yourcolor), PorterDuff.Mode.SRC)

0
button.setBackgroundColor(getResources().getColor(R.color.red);

设置此视图的背景颜色。 参数:背景颜色color

R.color.red是在gen目录下编译时生成的引用。


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