How do I change the default CheckBox color in Android?
By default the CheckBox color is green, and I want to change this color.
If it is not possible please tell me how to make a custom CheckBox?
29 Answers
You can change the color directly in XML. Use buttonTint for the box: (as of API level 23)
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:buttonTint="@color/CHECK_COLOR" /> You can also do this using appCompatCheckbox v7 for older API levels:
<android.support.v7.widget.AppCompatCheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" app:buttonTint="@color/COLOR_HERE" /> 5 Comments
If your minSdkVersion is 21+ use android:buttonTint attribute to update the color of a checkbox:
<CheckBox ... android:buttonTint="@color/tint_color" /> In projects that use AppCompat library and support Android versions below 21 you can use a compat version of the buttonTint attribute:
<CheckBox ... app:buttonTint="@color/tint_color" /> In this case if you want to subclass a CheckBox don't forget to use AppCompatCheckBox instead.
PREVIOUS ANSWER:
You can change CheckBoxs drawable using android:button="@drawable/your_check_drawable" attribute.
4 Comments
buttonTint seems to override the textColor value. Any ideas how to work around this?setButtonTintList(ColorStateList tint) I needed to use app:buttonTint even beyond API 21 (API 24 in my case), otherwise the method call seemed to have no effect.you can set android theme of the checkbox to get the color you want in your styles.xml add :
<style name="checkBoxStyle" parent="Base.Theme.AppCompat"> <item name="colorAccent">CHECKEDHIGHLIGHTCOLOR</item> <item name="android:textColorSecondary">UNCHECKEDCOLOR</item> </style> then in your layout file :
<CheckBox android:theme="@style/checkBoxStyle" android:id="@+id/chooseItemCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content"/> unlike using android:buttonTint="@color/CHECK_COLOR" this method works under Api 23
13 Comments
Use buttonTint to change color of button and color selector for above 21+ api version.
<android.support.v7.widget.AppCompatCheckBox android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content" app:buttonTint="@color/checkbox_filter_tint" tools:targetApi="21"/> res/colors/checkbox_filter_tint.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/light_gray_checkbox" android:state_checked="false"/> <item android:color="@color/common_red" android:state_checked="true"/> </selector> 5 Comments
values resource. As indicated by the path shown above, it has to be inside the colors resource folder.Programmatic version:
int [][] states = {{android.R.attr.state_checked}, {}}; int [] colors = {color_for_state_checked, color_for_state_normal} CompoundButtonCompat.setButtonTintList(checkbox, new ColorStateList(states, colors)); 5 Comments
I would suggest to use he style approach in android as the way to configure built-in android views, add new style in your project:
<style name="yourStyle" parent="Base.Theme.AppCompat"> <item name="colorAccent">your_color</item> <!-- for uncheck state --> <item name="android:textColorSecondary">your color</item> <!-- for check state --> </style> and add assign this style to the theme of the checkbox: android:theme="@style/youStyle"
hope this helps.
3 Comments
Add buttonTint in your xml
<CheckBox android:id="@+id/chk_remember_signup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:buttonTint="@android:color/white" android:text="@string/hint_chk_remember_me" /> 1 Comment
Add this line in your styles.xml file:
<style> <item name="android:colorAccent">@android:color/holo_green_dark</item> </style> 4 Comments
Me faced same problem, I got a solution using below technic. Copy the btn_check.xml from android-sdk/platforms/android-#(version)/data/res/drawable to your project's drawable folder and change the 'on' and 'off' image states to your custom images.
Then your xml will just need android:button="@drawable/btn_check"
<CheckBox android:button="@drawable/btn_check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" /> If you want to use different default Android icons, you can use:
android:button="@android:drawable/..." 2 Comments
buttonTint worked for me try
android:buttonTint="@color/white"
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:id="@+id/agreeCheckBox" android:text="@string/i_agree_to_terms_s" android:buttonTint="@color/white" android:layout_below="@+id/avoid_spam_text"/> Comments
create an xml Drawable resource file under res->drawable and name it, for example, checkbox_custom_01.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/checkbox_custom_01_checked_white_green_32" /> <item android:state_checked="false" android:drawable="@drawable/checkbox_custom_01_unchecked_gray_32" /> </selector> Upload your custom checkbox image files (i recommend png) to your res->drawable folder.
Then go in your layout file and change your checkbox to
<CheckBox android:id="@+id/checkBox1" android:button="@drawable/checkbox_custom_01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:focusable="false" android:focusableInTouchMode="false" android:text="CheckBox" android:textSize="32dip"/> you may customize anything, as long as android:button points to the correct XML file you created before.
NOTE TO NEWBIES: though it is not mandatory, it is nevertheless good practice to name your checkbox with a unique id throughout your whole layout tree.
Comments
100% robust approach.
In my case, I didn't have access to the XML layout source file, since I get Checkbox from a 3-rd party MaterialDialog lib. So I have to solve this programmatically.
- Create a ColorStateList in xml:
res/color/checkbox_tinit_dark_theme.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/white" android:state_checked="false"/> <item android:color="@color/positiveButtonBg" android:state_checked="true"/> </selector> Then apply it to the checkbox:
ColorStateList darkStateList = ContextCompat.getColorStateList(getContext(), R.color.checkbox_tint_dark_theme); CompoundButtonCompat.setButtonTintList(checkbox, darkStateList);
P.S. In addition if someone is interested, here is how you can get your checkbox from MaterialDialog dialog (if you set it with .checkBoxPromptRes(...)):
CheckBox checkbox = (CheckBox) dialog.getView().findViewById(R.id.md_promptCheckbox); Hope this helps.
Comments
If textColorSecondary does not work for you, you might have defined colorControlNormal in your theme to be a different color. If so, just use
<style name="yourStyle" parent="Base.Theme.AppCompat"> <item name="colorAccent">your_checked_color</item> <!-- for checked state --> <item name="colorControlNormal">your_unchecked_color</item> <!-- for unchecked state --> </style> Comments
Most answers go through the xml file. If you find an active answer for most Android versions and are just one color for the two statuses Check an UnCheck: here is my solution:
Kotlin:
val colorFilter = PorterDuffColorFilter(Color.CYAN, PorterDuff.Mode.SRC_ATOP) CompoundButtonCompat.getButtonDrawable(checkBox)?.colorFilter = colorFilter Java:
ColorFilter colorFilter = new PorterDuffColorFilter(Color.CYAN, PorterDuff.Mode.SRC_ATOP); Drawable drawable = CompoundButtonCompat.getButtonDrawable(checkBox); if (drawable != null) { drawable.setColorFilter(colorFilter); } Comments
Hi This is the theme code for both Dark Theme and Light Theme.
<attr name="buttonsearch_picture" format="reference"/> <attr name="buttonrefresh_picture" format="reference"/> <style name="Theme.Light" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@color/white</item> <item name="android:windowActionBar">false</item> <item name="android:textColorPrimary">@color/black</item> <item name="android:textColorSecondary">@color/black</item> <item name="android:textColor">@color/material_gray_800</item> <item name="actionOverflowButtonStyle">@style/LightOverflowButtonStyle</item> <item name="buttonsearch_picture">@drawable/ic_search_black</item> <item name="buttonrefresh_picture">@drawable/ic_refresh_black</item> </style> <style name="Theme.Dark" parent="Theme.AppCompat.NoActionBar"> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@color/white</item> <item name="android:windowActionBar">false</item> <item name="android:textColorPrimary">@color/white</item> <item name="android:textColorSecondary">@color/material_gray_500</item> <item name="android:textColor">@color/material_gray_800</item> <item name="actionOverflowButtonStyle">@style/DarkOverflowButtonStyle</item> <item name="buttonsearch_picture">@drawable/ic_search_white</item> <item name="buttonrefresh_picture">@drawable/ic_refresh_white</item> <item name="android:colorBackground">#ffffff</item> <item name="android:alertDialogTheme">@style/LightDialogTheme</item> <item name="android:alertDialogStyle">@style/LightDialogTheme</item> <!-- <item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>--> <item name="android:popupMenuStyle">@style/PopupMenu</item> </style> If you want to change checkbox color then "colorAccent" attribute will use for checked state and "android:textColorSecondary" will use for unchecking state.
"actionOverflowButtonStyle" will use for change the color of overflow icon in the Action bar.
"buttonsearch_picture" attribute will use for change tint color of Action Button in Action Bar.This is custom Attribute in style.xml
<attr name="buttonsearch_picture" format="reference"/> Same is for refresh button which i am using in my app.
"android:popupMenuStyle" attribute is using to get Light theme popup menu style in Dark theme.
<style name="PopupMenu" parent="Theme.AppCompat.Light.NoActionBar"> </style> And this is toolbar Code which I am using in my Rocks Player App.
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" app:contentInsetStart="0dp" android:title="Rocks Player" android:layout_width="match_parent" android:elevation="4dp" android:layout_height="48dp" app:layout_scrollFlags="scroll|enterAlways" android:minHeight="48dp" app:titleTextAppearance="@style/Toolbar.TitleText" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" android:background="?attr/colorPrimary" > </android.support.v7.widget.Toolbar> Themes:-
<style name="AppTheme0" parent="Theme.Light"> <item name="colorPrimary">#ffffff</item> <item name="colorPrimaryDark">#cccccc</item> <item name="colorAccent">#0294ff</item> </style> <style name="AppTheme1" parent="Theme.Dark"> <item name="colorPrimary">#4161b2</item> <item name="colorPrimaryDark">#4161b2</item> <item name="colorAccent">#4161b2</item> </style> Comments
My minSdkVersion is 15, my BaseAppTheme parent is Theme.AppCompat.Light.NoActionBar and I am creating my Checkboxes programmatically. The following steps worked for me.
1. In your Java code, change
CheckBox checkBox = new CheckBox(context); to
AppCompatCheckBox checkBox = new AppCompatCheckBox(context); 2. In your styles.xml, add:
<style name="MyCheckboxStyle" parent="Widget.AppCompat.CompoundButton.CheckBox"> <item name="buttonTint">@color/primary_dark</item> </style> 3. Finally, within your BaseAppTheme (or AppTheme) style, add:
<item name="checkboxStyle">@style/MyCheckboxStyle</item> <item name="android:checkboxStyle">@style/MyCheckboxStyle</item> Comments
you can create your own xml in drawable and use this as android:background="@drawable/your_xml"
in that you can give border corner everything
<item> <shape> <gradient android:endColor="#fff" android:startColor="#fff"/> <corners android:radius="2dp"/> <stroke android:width="15dp" android:color="#0013669e"/> </shape> </item> 1 Comment
My goal was to use a custom checkbox button and remove the accent color button tint. I tried the accepted answer but did now work instead this worked for me:
In the styles.xml file
<style name="Theme.Checkbox" parent="Widget.AppCompat.CompoundButton.CheckBox"> <item name="android:button">@drawable/theme_checkbox_button</item> <item name="android:drawableLeft">@android:color/transparent</item> <item name="android:drawablePadding">10dp</item> <item name="android:buttonTint">@android:color/transparent</item> <item name="android:buttonTintMode">screen</item> </style> Now for this question, only required attributes are android:buttonTint and android:buttonTintMode
Now some extras:
- I needed to use a custom drawable, hence
android:buttonis set with aselectordrawable - I needed some spacing between the box and the text hence I followed this SO answer and set the
android:drawableLeftandandroid:drawablePadding
Comments
You can change the background color of the <CheckBox> by embedding it inside a <LinearLayout>. Then change the background color of <LinearLayout> to the color you want.
1 Comment
You should try below code. It is working for me.
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/checked" android:state_checked="true"> <color android:color="@color/yello" /> </item> <!-- checked --> <item android:drawable="@drawable/unchecked" android:state_checked="false"> <color android:color="@color/black"></color> </item> <!-- unchecked --> <item android:drawable="@drawable/checked" android:state_focused="true"> <color android:color="@color/yello"></color> </item> <!-- on focus --> <item android:drawable="@drawable/unchecked"> <color android:color="@color/black"></color> </item> <!-- default --> </selector> and CheckBox
<CheckBox Button="@style/currentcy_check_box_style" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20dp" android:text="@string/step_one_currency_aud" /> 1 Comment
currentcy_check_box_style defined in your selector or theme? Where do you place the selector?If you are going to use the android icons, as described above ..
android:button="@android:drawable/..." .. it's a nice option, but for this to work - I found you need to add toggle logic to show/hide the check mark, like this:
checkBoxShowPwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { // checkbox status is changed from uncheck to checked. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int btnDrawable = android.R.drawable.checkbox_off_background; if (isChecked) { btnDrawable = android.R.drawable.checkbox_on_background; } checkBoxShowPwd.setButtonDrawable(btnDrawable); } }); 1 Comment
I prefer this extension function I've created:
fun CheckBox.setTint(@ColorInt color: Int?) { if (color == null) { CompoundButtonCompat.setButtonTintList(this, null) return } CompoundButtonCompat.setButtonTintMode(this, Mode.SRC_ATOP) CompoundButtonCompat.setButtonTintList(this, ColorStateList.valueOf(color)) } It's very similar to what I have for ImageView, in case anyone wants it too:
fun ImageView.setTint(@ColorInt color: Int?) { if (color == null) { ImageViewCompat.setImageTintList(this, null) return } ImageViewCompat.setImageTintMode(this, Mode.SRC_ATOP) ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color)) } Comments
I know I am late, but if you want to use different colors for checked and unchecked state, you can use material check box instead of normal check box, and set buttonTint and buttonIconTint
<com.google.android.material.checkbox.MaterialCheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" app:buttonIconTint="@color/black" app:buttonTint="@color/white" /> Comments
To change tint color using ColorStateList.
fun CheckBox.tint(colors: ColorStateList) { buttonTintList = colors } fun CheckBox.tint(@ColorInt color: Int) = tint(context.colorStateList(color)) For other general material views.
fun SeekBar.tint(@ColorInt color: Int) { val s1 = ColorStateList.valueOf(color) thumbTintList = s1 progressTintList = s1 } fun ProgressBar.tint(@ColorInt color: Int, skipIndeterminate: Boolean = false) { val sl = ColorStateList.valueOf(color) progressTintList = sl secondaryProgressTintList = sl if (!skipIndeterminate) indeterminateTintList = sl } Comments
You can use the below lines of code to change the background of the Checkbox dynamically in your java code.
//Setting up background color on checkbox. checkbox.setBackgroundColor(Color.parseColor("#00e2a5")); This answer was from this site. You can also use this site to convert your RGB color to the Hex value, you need to feed the parseColor
android:buttonTint="@color/mybrown"is an easy way to change the box color.app:buttonTint="@color/mybrown"instead, this way it can work on API < 21