How to set background color of a View
Asked Answered
R

22

200

I'm trying to set the background color of a View (in this case a Button).

I use this code:

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

It causes the Button to disappear from the screen. What am I doing wrong, and what is the correct way to change the background color on any View?

Thanks.

Regimentals answered 31/1, 2010 at 23:55 Comment(1)
That looks correct. In fact, I don't think you need to call invalidate(). When you say the button disappears, do you mean that literally or do you mean the button had text or an image on it that disappears?Contemn
X
300

You made your button transparent. The first byte is the alpha.

Try v.setBackgroundColor(0xFF00FF00);

Ximenez answered 1/9, 2011 at 23:5 Comment(4)
EddieB's answer below is much better as this removes any borders etc. such as an EditText's underliningFreefloating
@aroth is better Color.Green ? If I want color complext with argb ? ... your answer is deprecatedRostand
@delive - Come again? Color.GREEN is not deprecated, and includes the alpha byte. It's value is 0xff00ff00, exactly the same as what's suggested in the answer, except it also has the benefit of being human-readable. Most developers would prefer a human-readable solution.Sideboard
What do you write between the brackets when you want to refer to a color in your colors.xml?Rachitis
C
153

When you call setBackgoundColor it overwrites/removes any existing background resource, including any borders, corners, padding, etc. What you want to do is change the color of the existing background resource...

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

Experiment with PorterDuff.Mode.* for different effects.

Confrere answered 12/1, 2011 at 18:4 Comment(4)
"overwrites/removes any existing background resource," not really.Tighten
I had to use the above along with v.invalidate(); on the next line.Celiaceliac
tried this wasted time and went with the accepted answer, v.getBackground() gave nullpointer exception and crashed.Sacramentalism
This plus PorterDuff.Mode.SRC_IN solved for me so I wouldn't lose my background border.Sauternes
S
144

Several choices to do this...

Set background to green:

v.setBackgroundColor(0x00FF00);

Set background to green with Alpha:

v.setBackgroundColor(0xFF00FF00);

Set background to green with Color.GREEN constant:

v.setBackgroundColor(Color.GREEN);

Set background to green defining in Colors.xml

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

and using:

v.setBackgroundResource(R.color.myGreen);

and:

v.setBackgroundResource(R.color.myGreenWithAlpha);

or the longer winded:

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

and:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreenWithAlpha));
Spier answered 17/12, 2013 at 17:40 Comment(4)
getResources().getColor(...) got deprecated #31843483Carrelli
There's also: v.setBackgroundResource(R.color.myGreen); when using colors.xmlTrossachs
Removed the invalidate calls, as you can see setBackground... methods already call that.Phonotypy
v.setBackgroundColor(0x00FF00); is just their code which they say isn't working. I would also expect it to be transparent.Phonotypy
K
40

You can set the hex-color to any resource with:

View.setBackgroundColor(Color.parseColor("#e7eecc"));
Kinchinjunga answered 20/12, 2013 at 10:12 Comment(0)
D
16
// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

The code does not set the button to green. Instead, it makes the button totally invisible.

Explanation: the hex value of the color is wrong. With an Alpha value of zero, the color will be invisible.

The correct hex value is 0xFF00FF00 for full opacity green. Any Alpha value between 00 and FF would cause transparency.

Diehl answered 6/1, 2011 at 13:16 Comment(0)
L
14

For setting the first color to be seen on screen, you can also do it in the relevant layout.xml (better design) by adding this property to the relevant View:

android:background="#FF00FF00"
Lonergan answered 22/1, 2015 at 10:17 Comment(1)
The question makes clear that the color change needs to be dynamic.Regimentals
I
12

and what is the correct way to change the background color on any View?

On any View? What you have is correct, though you should drop the invalidate() call.

However, some Views already have backgrounds. A Button, for example, already has a background: the face of the button itself. This background is a StateListDrawable, which you can find in android-2.1/data/res/drawable/btn_default.xml in your Android SDK installation. That, in turn, refers to a bunch of nine-patch bitmap images, available in multiple densities. You would need to clone and modify all of that to accomplish your green goals.

In short, you will be better served finding another UI pattern rather than attempting to change the background of a Button.

Interpellation answered 1/2, 2010 at 0:55 Comment(1)
OK, thanks for the explanation about Button backgrounds. Nine patch bitmaps (developer.android.com/reference/android/graphics/NinePatch.html) were new to me. I simply want to change the color of anything on the screen when I press a Button. The Buttons are on a TextView. Trying to change the color of that, leads to console messages "DDM dispatch reg wait timeout... ActivityManager: Can't dispatch DDM chunk 52454151: no handler defined" and a dialog on screen "the app stopped unexpectedly". Guess I need to do more reading on the UI. Any hints welcome. Thanks.Regimentals
S
12

try to add:

setBackgroundColor(Color.parseColor("#FF0000"));
Satiate answered 28/9, 2015 at 8:58 Comment(0)
T
7

I use at API min 16 , target 23

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

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));
Thurman answered 30/3, 2016 at 10:51 Comment(0)
S
7

This works for me

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

That way only changes the color of the background without change the background itself. This is usefull for example if you have a background with rounded corners.

Scotsman answered 13/2, 2021 at 1:16 Comment(0)
E
6
mButton.setBackgroundColor(getResources().getColor(R.color.myColor));
Esophagitis answered 12/5, 2017 at 9:20 Comment(0)
S
5

You can simple use :

view.setBackgroundColor(Color.parseColor("#FFFFFF"));
Stepaniestepbrother answered 23/8, 2015 at 11:13 Comment(0)
D
5

You can simple use :

view.setBackgroundColor(Color.rgb(0, 198, 255));
Dillon answered 2/9, 2018 at 9:53 Comment(0)
S
4

This question talks about changing the background color of a view. In one of the answers, the person explains how to change the background color during runtime. Obviously you are going to look into how to modify other objects on the screen, but this should give you a good start by at least allowing you to modify the background color of the view on button click.

Sagittarius answered 9/12, 2010 at 21:18 Comment(0)
C
4

Stating with Android 6 use ContextCompact

        view.setBackgroundColor( ContextCompat.getColor(this, R.color.your_color));
Complacent answered 2/6, 2016 at 12:1 Comment(0)
F
2

In kotlin you could do it like this:

val backgroundColor = R.color.whatever_color_you_like
view.setBackgroundColor(getColorCompat(backgroundColor))

Where getColorCompat() is an extension function:

/**
 * Extension method to provide simpler access to {@link ContextCompat#getColor(int)}.
 */

 fun Context.getColorCompat(color: Int) = ContextCompat.getColor(this, color)
Fructify answered 27/10, 2019 at 14:6 Comment(0)
S
1
view.setBackgroundColor(R.color.primaryColor);

Adds color to previous color value, so i have a different color.

What works for me is :

view.setBackgroundResource(R.color.primaryColor);
Styptic answered 8/3, 2019 at 13:51 Comment(0)
C
1

Let suppose we have a primary color in values=>colors.xml as:

<resources>
    <color name="primary">#FDD835</color>
</resources>

so if we want to use our custom color into setBackgroundColor(@ColorInt int Color) then we just need an annotation @SuppressLint("ResourceAsColor") with constructor/method which will be used as:

    @SuppressLint("ResourceAsColor")
    public _LinearLayout(Context context) {
        super(context);

        // Formatting our layout : )
        super.setBackgroundColor(R.color.primary);

        ....


    }
Cand answered 10/3, 2019 at 13:18 Comment(0)
A
0

You must pass an int in the argument.

First Example:

view.setBackgroundColor(-500136)

Second Example:

int colorId = R.color.green;

view.setBackgroundResource(colorId);
Amongst answered 1/10, 2019 at 16:28 Comment(0)
P
0

This should work fine: v.setBackgroundColor(0xFF00FF00);

Pattani answered 1/10, 2019 at 18:22 Comment(0)
Y
0

I tried all the above ways. But I havent achieve what i need. Here is my try. If you are using hexcode for color and want to set the color as background of image, then this is the kotlin code.

val bitmap = Bitmap.createBitmap(30, 30, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val colorCode = "#ffffff"
canvas.drawColor(Color.parseColor(colorCode))
mImageViewLogo.setImageBitmap(bitmap)
Younglove answered 14/12, 2019 at 10:7 Comment(0)
S
0

When calling setBackgroundColor on a view you need to set the alpha value to a non-zero value (e.g. 0xFF), otherwise the color will not show up.

TextView tv = (TextView)findViewById(R.id.myTextview);
int rgb = 0xF05922; // Orange
tv.setBackgroundColor(0xFF000000|rgb); // Use bitwise OR to add alpha to RGB value
Subinfeudation answered 21/1, 2023 at 23:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.