【问题标题】:android set button background programmaticallyandroid以编程方式设置按钮背景
【发布时间】:2012-12-12 14:59:21
【问题描述】:

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

Button11.setBackgroundColor(R.color.red);

谢谢!!

【问题讨论】:

  • 你想得到什么效果?没有附加效果的纯红色矩形?如果不是,您将需要某种可绘制来实现您的目标,无论是 png(9patch)还是在 xml 中定义的东西。系统没有内置方法来制作一个看起来像普通按钮但颜色不同的按钮。您必须提供自己的资源,除非您只是在寻找一个普通的单色矩形。
  • 实际上我正在做的是从 12 个按钮的表格中,程序会随机选择其中的 6 个来填充定义的文本。我希望这 6 个按钮变成另一种不同的颜色。在这方面,它不能在 xml 部分中完成,而只能以编程方式完成。我已经定义了一些xml(第一个未选中的是纯绿色圆形,如果选中我希望它变成纯红色圆形)如果这样,可以做到吗?
  • 是的,但是您要么需要像 9patch png 这样的红色按钮图像,要么需要在 xml 中定义红色按钮形状。如果您只是将背景颜色更改为红色,您最终会得到一个纯红色的矩形,而不是看起来像普通按钮的东西。
  • 是的,你是对的,我已经修改了它,它给出了一个纯红色的矩形,甚至无法按下!我已经单独定义了red_button_xml,怎么能合并到Activity中呢?非常感谢!
  • 你会想要Button.setBackgroundResource()而不是setBackgroundColor()

标签: android button


【解决方案1】:

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

【讨论】:

  • 如何为多个以编程方式创建的按钮设置不同的颜色?
  • 但它会删除所有样式,例如边框或圆角。所以它实际上为按钮区域设置颜色,而不是像 OP 请求的按钮颜色。
  • 请考虑 getColor() 现在已弃用。使用ContextCompatstackoverflow.com/a/32149275/1358777
【解决方案2】:

老帖子,但学到了新东西,希望这可能对某人有所帮助。

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

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

【讨论】:

  • setColorFilter 仅对现有背景设置色调。它不会设置新的背景颜色。
  • 如果您使用材质样式的凸起按钮,这将起作用。不是Button.setBackgroundColor()
  • 现在是 2017 年,为了从资源中设置颜色而编写一大堆样板文件仍然很难看......
  • 为什么使用PorterDuff.Mode.MULTIPLY 而不是PorterDuff.Mode.SRC?前者不会与现有颜色混合吗?
【解决方案3】:

2020 年及以后您正在寻找的答案:

  • setColorFilter(color, mode) 自 API 29 起已弃用 (as discussed here)
  • button.setBackgroundColor(color) 按钮样式混乱

现在设置按钮颜色的正确方法是使用BlendModeColorFilter() (see documentation)。

用法:

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 方法考虑了源颜色。
【解决方案4】:

您可以通过编程方式为按钮设置所需的颜色,例如:

Button11.setBackgroundColor(Android.Graphics.Color.parseColor("#738b28"));

您还可以为按钮指定文本颜色,例如:

Button11.setTextColor(Android.Graphics.Color.parseColor("#FFFFFF"));

【讨论】:

  • btn.setBackgroundColor(Color.parseColor("#97a0ad")); 也可以
【解决方案5】:

我发现 Android Studio 在尝试执行此操作时向我发出警告,getColor() 已被弃用:

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

所以我发现执行以下方法是简单、最新的解决方案:

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

您希望避免在颜色参数中进行硬编码,因为它被认为是错误的代码样式。

编辑:将setBackgroundColor() 与我自己的按钮一起使用后,我看到内部按钮填充扩展了。我找不到任何方法将其改回将高度和宽度都设置为“wrap_content”。也许它是一个错误。

来源: https://stackoverflow.com/a/32202256/6030520

【讨论】:

    【解决方案6】:

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

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

    这并没有改变按钮的大小,也适用于旧的 android 版本。

    【讨论】:

      【解决方案7】:

      使用 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);
      
              }
          });
      

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

      【讨论】:

        【解决方案8】:

        进一步来自 @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);
        

        【讨论】:

          【解决方案9】:
          button.setBackgroundColor(getResources().getColor(R.color.red);
          

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

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

          【讨论】:

            【解决方案10】:

            您可以使用下面的代码作为按钮颜色,而不会影响样式

             yourbtnid.background.setColorFilter(ContextCompat.getColor(context, yourcolor), PorterDuff.Mode.SRC)
            

            【讨论】:

              猜你喜欢
              • 2011-04-13
              • 2011-03-07
              • 1970-01-01
              • 2013-01-26
              • 2020-05-15
              • 1970-01-01
              • 2023-03-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多