如何设置一个视图的背景颜色

199
我正在尝试设置一个视图(在这种情况下是一个按钮)的背景颜色。
我使用以下代码:
// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

这会导致按钮从屏幕上消失。我做错了什么,改变任何视图的背景颜色的正确方法是什么?

谢谢。


1
那看起来是正确的。事实上,我认为你不需要调用invalidate()。当你说按钮消失时,你是指文字或图像消失了吗? - RickNotFred
22个回答

300
你将按钮设置为透明。第一个字节是透明度。
尝试使用 v.setBackgroundColor(0xFF00FF00);

2
EddieB在下面的回答中更好,因为它可以去除任何边框等,比如EditText的下划线。 - Molten Ice
@aroth更好的是Color.Green吗?如果我想要带有ARGB的颜色复杂度,那么你的答案已经过时了。 - user3402040
2
@delive - 请再说一遍?Color.GREEN并未被弃用,且包含alpha字节。它的值为0xff00ff00,与答案中建议的完全相同,但它还具有“可读性强”的优点。大多数开发人员更喜欢一个易于理解的解决方案。 - aroth
当您想在colors.xml中引用颜色时,您在括号之间写什么? - Steven

153

当您调用setBackgoundColor时,它会覆盖/删除任何现有的背景资源,包括任何边框,角落,填充等。 您想要做的是更改现有背景资源的颜色...

View v;
v.getBackground().setColorFilter(Color.parseColor("#00ff00"), PorterDuff.Mode.DARKEN);

尝试使用PorterDuff.Mode.*来获得不同的效果。


“覆盖/删除任何现有的背景资源”,并非如此。 - Yousha Aleayoub
2
我必须在下一行使用上述代码以及v.invalidate()。 - Hashim Akhtar
2
尝试了这个,浪费了时间,最终采用了被接受的答案。v.getBackground() 报了空指针异常并崩溃了。 - Siddarth G
这个加上 PorterDuff.Mode.SRC_IN 对我很有帮助,这样我就不会失去背景边框了。 - Guilherme Carvalho

144

有几种方法可以实现这个...

将背景设置为绿色:

v.setBackgroundColor(0x00FF00);

使用 Alpha 将背景设置为绿色:

v.setBackgroundColor(0xFF00FF00);

使用Color.GREEN常量将背景设置为绿色:

v.setBackgroundColor(Color.GREEN);

将背景设置为在Colors.xml中定义的绿色

<?xml version="1.0" encoding="utf-8"?>
<resources>     
    <color name="myGreen">#00FF00</color> 
    <color name="myGreenWithAlpha">#FF00FF00</color> 
</resources>

并使用:

v.setBackgroundResource(R.color.myGreen);

并且:

v.setBackgroundResource(R.color.myGreenWithAlpha);

或者更冗长的说法:
v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreen));

并且:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreenWithAlpha));

getResources().getColor(...) 已经被弃用 https://dev59.com/LFwZ5IYBdhLWcg3wG9F_ - Junior Mayhé
5
同时也可以使用colors.xml,代码为v.setBackgroundResource(R.color.myGreen); - grim
已删除 invalidate 调用,因为您可以看到setBackground... 方法已经调用了它。 - weston
“v.setBackgroundColor(0x00FF00);” 是他们说无法正常工作的代码。我也希望它是透明的。 - weston

40

您可以使用以下代码将十六进制颜色设置为任何资源:

View.setBackgroundColor(Color.parseColor("#e7eecc"));

16
// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

代码没有将按钮设置为绿色,而是使按钮完全不可见。

解释:颜色的十六进制值是错误的。Alpha 值为零时,颜色将变为不可见。

完全不透明的绿色的正确十六进制值是 0xFF00FF00。介于 00 和 FF 之间的任何 Alpha 值都会导致透明度。


13

要在屏幕上设置首个显示的颜色,你也可以通过在相关的layout.xml(更好的设计)中为相应的View添加此属性来实现:

android:background="#FF00FF00"

问题明确表明颜色变化需要是动态的。 - Peter vdL

12

尝试添加:

setBackgroundColor(Color.parseColor("#FF0000"));

12
在任何视图上更改背景颜色的正确方法是什么? 在任何

好的,感谢你对按钮背景的解释。Nine patch位图(http://developer.android.com/reference/android/graphics/NinePatch.html)是我第一次接触到的。当我按下按钮时,我只想改变屏幕上任何东西的颜色。这些按钮在TextView上。试图改变它的颜色会导致控制台消息“DDM dispatch reg wait timeout…… ActivityManager: Can't dispatch DDM chunk 52454151: no handler defined”,以及屏幕上的一个对话框“the app stopped unexpectedly”。我猜我需要在用户界面上进行更多的阅读。欢迎任何提示。谢谢。 - Peter vdL

7

这对我来说有效

v.getBackground().setTint(Color.parseColor("#212121"));

这种方式只会改变背景的颜色,而不会改变背景本身。例如,如果您的背景带有圆角,则这很有用。


7

我使用的API最低版本为16,目标版本为23。

Button WeekDoneButton = (Button) viewWeeklyTimetable.findViewById(R.id.week_done_button);

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));

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