如何在Android中更改CheckBox的颜色

316
如何在Android中更改默认的CheckBox颜色? 默认情况下,CheckBox的颜色是绿色的,我想要改变这个颜色。 如果不可能的话,请告诉我如何制作自定义的CheckBox?

1
你是想改变字体的颜色吗?还是实际框的颜色? - user725913
1
实际的盒子颜色我改变了。 - Piyush
90
android:buttonTint="@color/mybrown" 进行设置是改变方框颜色的简单方法。 - shauvik
6
@Shauvik,它只是在使用物料设计工作 :) - Mucahit
12
最好使用app:buttonTint="@color/mybrown"来代替,这样可以在API < 21上工作。 - Nikaoto
显示剩余2条评论
27个回答

428
你可以直接在XML中更改颜色。使用buttonTint来设置框的颜色:(API级别23及以上)
<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:buttonTint="@color/CHECK_COLOR" />

您也可以在较旧的API级别中使用appCompatCheckbox v7来完成此操作:

<android.support.v7.widget.AppCompatCheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:buttonTint="@color/COLOR_HERE" /> 

5
AppCompatCheckBox是一个Android平台上的视图控件,它提供了一个复选框的可定制版本,可以与早期版本的Android API兼容。非常感谢,我之前并不知道这个信息。 - moskis
8
好的,谢谢!别忘了在你的主/父布局中添加 _xmlns:app="http://schemas.android.com/apk/res-auto"_。 - Alberto Méndez
2
我使用 'android.support.v7.widget.AppCompatCheckBox' 无法工作。 - Zvi
1
当您在布局中使用CheckBox时,将自动使用此类。仅在编写自定义视图时才需要手动使用此类。 - 최봉재
4
考虑为选中和未选中状态设置两种不同的颜色,怎么样? - DYS
显示剩余2条评论

291

如果您的minSdkVersion是21+,请使用android:buttonTint属性来更新复选框的颜色:

<CheckBox
  ...
  android:buttonTint="@color/tint_color" />

在使用AppCompat库并支持安卓21版本以下的项目中,你可以使用buttonTint属性的兼容版本:

<CheckBox
  ...
  app:buttonTint="@color/tint_color" />
在这种情况下,如果您想子类化 CheckBox ,不要忘记使用 AppCompatCheckBox 代替。
android:button="@drawable/your_check_drawable" 属性的形式可以更改 CheckBox 的可绘制部分。

7
你需要创建自己的可绘制对象。一定有更简单的方法... - IgorGanapolsky
16
改变按钮的颜色是一种更直接的方式。我们必须使用原生元素,而不是不必要地自定义它。 - Neela
3
注意:对于 Material Design 样式,现在有 contentControl 选项可供使用:https://materialdoc.com/components/selection-controls/ - SimpsOff
buttonTint的值似乎会覆盖textColor的值。有什么解决方法吗? - Alex Semeniuk

151

您可以在styles.xml中设置Android复选框的主题,以获取所需的颜色,添加:

<style name="checkBoxStyle" parent="Base.Theme.AppCompat">
    <item name="colorAccent">CHECKEDHIGHLIGHTCOLOR</item>
    <item name="android:textColorSecondary">UNCHECKEDCOLOR</item>
</style>

然后在您的布局文件中:

<CheckBox
     android:theme="@style/checkBoxStyle"
     android:id="@+id/chooseItemCheckBox"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>

与使用 android:buttonTint="@color/CHECK_COLOR" 不同,这种方法适用于 Api 23 及以下版本


7
谢谢您!就是这样。我搜索了很久才找到方法来更改未选中的背景颜色,而且不想使用自定义可绘制对象。就是这个方法! - Mulgard
2
对我来说有效,但需要添加到CheckBox xml中才能看到文本-android:textColor="@color/textColor"。 - Zvi
1
@Zvi 我不确定你能否以编程方式完成这个任务。 - Amr El Aswar
@Zvi,请看下面的程序版本的答案。 - mbonnin
我正在尝试在React Native中使用它。我应该把<Checkbox />字段放在哪里? - Surendra Pathak
显示剩余9条评论

79
使用buttonTint可更改按钮和21+ api版本以上的颜色选择器的颜色。
<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>

3
可以的,请问您需要翻译的是什么内容? - GGO
在SO中始终坚持使用英语。 - nyconing
1
这是一个更好的答案。 - Vivek A Naik
1
这似乎是唯一适用于所有设备的设置已选和未选颜色的简单方法。 - Gumby The Green
2
这应该是被接受的答案。但需要注意的是当选择器声明为“values”资源时它不起作用。正如上面所示的路径所指出的那样,它必须在“colors”资源文件夹内。 - Benjamin Basmaci

58

编程版本:

int [][] states = {{android.R.attr.state_checked}, {}};
int [] colors = {color_for_state_checked, color_for_state_normal}
CompoundButtonCompat.setButtonTintList(checkbox, new ColorStateList(states, colors));

2
感谢您。你很棒,是更好的解决方案。 - Carlos
1
它给了我意外的颜色结果,你确定没有混淆什么吗? - Kirill Karmazin
@Carlos 这并不是一个“更好”的解决方案,因为在 Android 中,除非你需要动态更改它,否则你应该始终尝试在 XML 文件中设置所有的布局内容,而不是以编程方式实现。 - kyay10
2
@kyay 不是“总是”……Android资源系统很混乱,通常以编程方式完成更容易维护。 - nyholku
它有助于关注点分离。 - kyay10
@kyay10 那完全是错误的陈述。如果您持相反意见,请看看 Jetpack Compose 的情况。 - Joaquin Iurchuk

21

我建议在Android中使用样式方式来配置内置的Android视图,并在项目中添加新的样式:

<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>

并将此样式分配给复选框的主题: android:theme="@style/youStyle"

希望这可以帮助到您。


同意这个解决方案,这些属性应该与默认的内置Android组件更好地配合使用,而不需要在可绘制对象上像被投票赞成的答案那样麻烦。 - Trung Le
1
这是对Amro elaswar九个月前回答的重复。 - jk7
这是一种真正的解决方案。 - Iharob Al Asimi

20
在你的xml中添加buttonTint。
<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" />

2
此答案的内容已经存在于afathman的答案中。 - MTCoster

11
在你的 styles.xml 文件中添加这一行:
<style>
    <item name="android:colorAccent">@android:color/holo_green_dark</item>
</style>

请编辑您的答案并附上示例,不要将其发布为评论。 - bish
4
轻微更正:它是<item name="**android**:colorAccent"></item>。 此外,这仅适用于API 21及以上版本。 - user3829751
这会改变colorAccent的颜色,这不是被要求的。 - Alberto M
1
在Galaxy S3上,它只改变了CheckBox的选中状态。但是未选中状态仍然保持不变。 - Slava

8

我曾经遇到过同样的问题,我使用以下技巧找到了一个解决方案。从android-sdk/platforms/android-#(version)/data/res/drawable中复制btn_check.xml到您项目的可绘制文件夹中,并将“on”和“off”图像状态更改为您自定义的图像。
然后您的xml只需要android:button="@drawable/btn_check"

<CheckBox
    android:button="@drawable/btn_check"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true" />

如果您想使用不同的默认Android图标,可以使用以下方法:
android:button="@android:drawable/..."

非常好的答案 - 比创建自定义xml容易多了..谢谢!对我来说,我有一个灰色的背景,复选框边框不可见。我添加了这个,现在你可以看到它了:android:button="@android:drawable/checkbox_off_background" - Gene Bo
1
使用这种方法实际上比我意识到的要复杂一些...但仍然是一个不错的选择。我在下面添加了详细信息https://dev59.com/jm025IYBdhLWcg3wsIIU#29831532 - Gene Bo

8
"buttonTint对我有用,尝试使用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"/>

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