Làm cách nào để thay đổi màu của CheckBox?


247

Làm cách nào để thay đổi CheckBoxmàu mặc định trong Android?
Theo mặc định, CheckBoxmàu là màu xanh lá cây và tôi muốn thay đổi màu này.
Nếu không thể xin vui lòng cho tôi biết làm thế nào để thực hiện một tùy chỉnh CheckBox?


1
Bạn đang cố gắng thay đổi màu của phông chữ? Hoặc màu sắc của hộp thực tế?

1
màu hộp thực tế tôi thay đổi
Piyush

72
Đặt android:buttonTint="@color/mybrown"là một cách dễ dàng để thay đổi màu hộp.
shauvik

6
@Shauvik nó chỉ hoạt động trên thiết kế vật liệu :)
Mucahit 13/07/2015

9
@shauvik tốt hơn nên sử dụng app:buttonTint="@color/mybrown"thay vào đó, cách này có thể hoạt động trên API <21
Nikaoto

Câu trả lời:


187

Nếu bạn trên minSdkVersion21 tuổi, hãy sử dụng android:buttonTintthuộc tính để cập nhật màu của hộp kiểm:

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

Trong các dự án sử dụng thư viện AppCompat và hỗ trợ các phiên bản Android dưới 21, bạn có thể sử dụng phiên bản compat của buttonTintthuộc tính:

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

Trong trường hợp này nếu bạn muốn phân lớp, CheckBoxđừng quên sử dụng AppCompatCheckBoxthay thế.

TRẢ LỜI TRƯỚC:

Bạn có thể thay đổi CheckBoxs drawable bằng android:button="@drawable/your_check_drawable"thuộc tính.


7
Bạn sẽ phải tạo ra khả năng vẽ của riêng bạn. Phải có một cách đơn giản hơn ...
IgorGanapolsky

14
Thay đổi nútTint màu là một cách đơn giản hơn. Chúng ta phải sử dụng các yếu tố bản địa thay vì tùy chỉnh nó một cách không cần thiết.
Neela

3
Lưu ý: Đối với kiểu dáng thiết kế vật liệu, hiện có các contentControltùy chọn: Materialdoc.com/components/selection-controls
Simps Offer

392

Bạn có thể thay đổi màu trực tiếp trong XML. Sử dụng buttonTintcho hộp: (kể từ API cấp 23)

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:buttonTint="@color/CHECK_COLOR" />

Bạn cũng có thể làm điều này bằng cách sử dụng appCompatCheckbox v7cho các cấp API cũ hơn:

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

5
AppCompatCheckBox ... Cảm ơn. Tôi không biết điều này.
moskis

8
Rất vui, cảm ơn! Và đừng quên thêm xmlns: app = " schemas.android.com/apk/res-auto " vào bố cục chính / phụ huynh của bạn
Alberto Méndez

2
Không hoạt động đối với tôi bằng cách sử dụng 'android.support.v7.widget.AppCompatCheckBox'
Zvi

1
Điều này sẽ tự động được sử dụng khi bạn sử dụng CheckBox trong bố cục của mình. Bạn chỉ cần sử dụng thủ công lớp này khi viết chế độ xem tùy chỉnh.
최봉재

2
Làm thế nào về việc thiết lập 2 màu khác nhau cho các trạng thái được kiểm tra và không được kiểm tra?
DYS

129

bạn có thể đặt chủ đề Android của hộp kiểm để có được màu bạn muốn trong tệp kiểu tệp của bạn thêm:

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

sau đó trong tập tin bố trí của bạn:

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

Không giống như sử dụng android:buttonTint="@color/CHECK_COLOR"phương pháp này hoạt động theo Api 23


5
TEXTCOLORSECONDary !!!! Cảm ơn bạn! Đó là nó. Tôi đã tìm kiếm từ lâu để chỉ thay đổi màu nền không được chọn và không muốn làm việc với các ngăn kéo tùy chỉnh. Đây là nó!
Mulgard

@Mulgard rất vui vì tôi có thể giúp!
Amro elaswar

2
Làm việc cho tôi, nhưng cần thêm vào CheckBox xml để có thể xem văn bản - android: textColor = "@ color / textColor"
Zvi

Làm thế nào để tôi làm điều đó cũng lập trình?
Zvi

@Zvi Tôi không chắc bạn có thể làm điều này theo chương trình
Amro elaswar 16/07/2016

48

Phiên bản lập trình:

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

1
Cảm ơn bạn. Bạn đá, Giải pháp tốt hơn.
Carlos

nó mang lại cho tôi kết quả bất ngờ với màu sắc, bạn có chắc là bạn không nhầm lẫn gì không?
Kirill Karmazin

@Carlos Đây không phải là "tốt hơn" giải pháp, bởi vì trong android bạn nên luôn luôn cố gắng thiết lập tất cả các công cụ bố trí trong file xml và không lập trình trừ khi bạn cần phải thay đổi nó tự động
kyay

@kyay Không phải "luôn luôn" ... hệ thống tài nguyên Android là một mớ hỗn độn và thường làm việc đó theo chương trình sẽ dễ dàng hơn và dễ bảo trì hơn.
nyholku

Nó giúp loại bỏ mối quan tâm
kyay

42

Sử dụng buttonTintđể thay đổi màu của nút và bộ chọn màu cho phiên bản api trên 21+.

<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 / hộp_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
Bạn có thể nói tiếng Anh và giải thích câu trả lời của bạn không
GGO

Luôn luôn gắn bó với tiếng Anh trong SO.
nyconing

Đó là một câu trả lời tốt hơn
Vivek A Naik

Đây dường như là cách tiếp cận đơn giản duy nhất để cài đặt cả màu được kiểm tra và không được kiểm tra hoạt động trên tất cả các thiết bị.
Gumby The Green

Đây phải là câu trả lời được chấp nhận. Mặc dù cần lưu ý rằng nó không hoạt động khi bộ chọn được khai báo là valuestài nguyên. Như được chỉ ra bởi đường dẫn hiển thị ở trên, nó phải nằm trong colorsthư mục tài nguyên.
Benjamin Basmaci

18

Tôi sẽ đề nghị sử dụng cách tiếp cận theo phong cách của anh ấy trong Android như là cách để định cấu hình các chế độ xem Android tích hợp, thêm phong cách mới trong dự án của bạn:

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

và thêm gán kiểu này cho chủ đề của hộp kiểm: android: theme = "@ style / youStyle"

hi vọng điêu nay co ich.


đồng ý với giải pháp này, các thuộc tính đó sẽ hoạt động tốt hơn với thành phần Android tích hợp mặc định mà không gặp rắc rối về khả năng rút ra như câu trả lời được nâng cấp.
Trung Lê

1
Đây là sự lặp lại câu trả lời của Amro elaswar từ 9 tháng trước.
jk7

Đây là loại giải pháp là GIẢI PHÁP THỰC SỰ.
Iharob Al Asimi

16

Thêm nútTint trong xml của bạn

<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
Nội dung của câu trả lời này đã tồn tại trong câu trả lời của afathman .
MTCoster

10

Thêm dòng này trong styles.xmltệp của bạn :

<style>
    <item name="android:colorAccent">@android:color/holo_green_dark</item>
</style>

Vui lòng chỉnh sửa câu trả lời của bạn với ví dụ của bạn và không đăng nó dưới dạng nhận xét
bish

4
Chỉnh sửa nhẹ: Đó là <item name = " android : colorAccent> </ item>. Ngoài ra, điều này chỉ có sẵn từ API 21 trở lên.
user3829751

điều này thay đổi colorAccent, đó không phải là những gì nó được hỏi
Alberto M

1
Trên Galaxy S3, nó chỉ thay đổi trạng thái kiểm tra của CheckBox. Nhưng trạng thái không được kiểm soát vẫn như vậy.
Slava

9

buttonTint làm việc cho tôi thử

android: buttonTint = "@ màu / trắng"

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

8

Tôi phải đối mặt với cùng một vấn đề, tôi đã có một giải pháp sử dụng dưới đây kỹ thuật. Sao chép btn_check.xmltừ android-sdk/platforms/android-#(version)/data/res/drawablevào thư mục có thể vẽ của dự án của bạn và thay đổi trạng thái hình ảnh 'bật' và 'tắt' thành hình ảnh tùy chỉnh của bạn.
Sau đó, xml của bạn sẽ chỉ cầnandroid:button="@drawable/btn_check"

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

Nếu bạn muốn sử dụng các biểu tượng Android mặc định khác nhau, bạn có thể sử dụng:

android:button="@android:drawable/..."

Câu trả lời tuyệt vời - dễ dàng hơn nhiều so với việc tạo xml tùy chỉnh .. cảm ơn! Đối với tôi, tôi có nền màu xám và đường viền hộp kiểm không hiển thị. Tôi đã thêm cái này và bạn có thể thấy nó ngay bây giờ: android: button = "@ android: drawable / Box_off_background"
Gene Bo

1
Thực sự có nhiều hơn một chút để sử dụng phương pháp này hơn tôi nhận ra .. nhưng vẫn là một lựa chọn tốt. Tôi đã thêm chi tiết bên dưới stackoverflow.com/a/29831532/2162226
Gene Bo

5

Bạn có thể thay đổi checkboxmàu bằng cách sử dụng dòng mã singe

android:buttonTint="@color/app_color" //whatever color


4

Cách tiếp cận mạnh mẽ 100%.

Trong trường hợp của tôi, tôi không có quyền truy cập vào tệp nguồn bố cục XML, vì tôi nhận được Hộp kiểm từ một bên thứ ba MaterialDialog lib. Vì vậy, tôi phải giải quyết điều này bằng lập trình.

  1. Tạo một ColorStateList trong xml:

res / color / box_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>
  1. Sau đó áp dụng nó vào hộp kiểm:

    ColorStateList darkStateList = ContextCompat.getColorStateList(getContext(), R.color.checkbox_tint_dark_theme);
    CompoundButtonCompat.setButtonTintList(checkbox, darkStateList);

Ngoài ra, nếu ai đó quan tâm, đây là cách bạn có thể nhận hộp kiểm của mình từ hộp thoại MaterialDialog (nếu bạn đặt nó với .checkBoxPromptRes(...)):

CheckBox checkbox = (CheckBox) dialog.getView().findViewById(R.id.md_promptCheckbox);

Hi vọng điêu nay co ich.


3

tạo một xml Drawable resource filebên dưới res->drawablevà đặt tên cho nó, ví dụ,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>

Tải lên tệp hình ảnh hộp kiểm tùy chỉnh của bạn (tôi khuyên bạn nên png) vào res->drawablethư mục của bạn .

Sau đó vào tệp bố cục của bạn và thay đổi hộp kiểm của bạn thành

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

bạn có thể tùy chỉnh mọi thứ, miễn là android:buttontrỏ đến tệp XML chính xác mà bạn đã tạo trước đó.

LƯU Ý CHO NEWBIES: mặc dù không bắt buộc, tuy nhiên, nên đặt tên cho hộp kiểm của bạn bằng một id duy nhất trong toàn bộ cây bố cục của bạn.


3

Xin chào Đây là mã chủ đề cho cả Dark Theme và 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>

Nếu bạn muốn thay đổi màu hộp kiểm thì thuộc tính "colorAccent" sẽ sử dụng cho trạng thái đã chọn và "android: textColorSecondary" sẽ sử dụng cho trạng thái bỏ chọn.

"ActionOverflowButtonStyle" sẽ sử dụng để thay đổi màu của biểu tượng tràn trong thanh Hành động.

Thuộc tính "scriptsearch_picture" sẽ sử dụng để thay đổi màu sắc của Nút hành động trong Action Bar. Đây là thuộc tính tùy chỉnh trong style.xml

<attr name="buttonsearch_picture" format="reference"/>

Tương tự là cho nút refresh mà tôi đang sử dụng trong ứng dụng của mình.

Thuộc tính "android: popupMothyStyle" đang sử dụng để có được kiểu menu bật lên chủ đề Light trong chủ đề Dark.

<style name="PopupMenu" parent="Theme.AppCompat.Light.NoActionBar">
</style>

Và đây là Mã thanh công cụ mà tôi đang sử dụng trong Ứng dụng Rocks Player của mình.

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

Chủ đề: -

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

2

bạn có thể tạo xml của riêng mình trong drawable và sử dụng cái này như android: background = "@ drawable / your_xml"

trong đó bạn có thể cung cấp cho góc biên giới tất cả mọi thứ

<item>
    <shape>
        <gradient

            android:endColor="#fff"
            android:startColor="#fff"/>
        <corners
            android:radius="2dp"/>
        <stroke
            android:width="15dp"
            android:color="#0013669e"/>

    </shape>
</item>


1
Mặc dù không có gì để biết về đồ họa vector có thể vẽ được, câu trả lời này không trả lời câu hỏi của OP về màu nút.
Mike Poole

2

Bạn có thể sử dụng hai thuộc tính sau trong "colors.xml"

<color name="colorControlNormal">#eeeeee</color>
<color name="colorControlActivated">#eeeeee</color>

colorControlN normal dành cho chế độ xem bình thường của hộp kiểm và colorControlActivated dành cho khi hộp kiểm được chọn.


1

Bạn có thể thay đổi màu nền của <CheckBox>bằng cách nhúng nó vào bên trong a <LinearLayout>. Sau đó thay đổi màu nền của <LinearLayout>màu bạn muốn.


Câu hỏi là về màu sắc của hộp kiểm tra chứ không phải nền
Zvi

1

Bạn nên thử mã dưới đây. Đó là làm việc cho tôi.

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

và hộp kiểm

<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

Nếu bạn sẽ sử dụng các biểu tượng Android, như được mô tả ở trên ..

android:button="@android:drawable/..."

.. đó là một lựa chọn tốt, nhưng để nó hoạt động - Tôi thấy bạn cần thêm logic chuyển đổi để hiển thị / ẩn dấu kiểm, như thế này:

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

        }
    });

Chà, đây là công việc làm thêm mà thực sự không cần thiết. Trong tệp xml của drawable, bạn cung cấp các tham chiếu đến bật hoặc tắt các tài nguyên có thể vẽ cho bộ chọn. Điều này sẽ tự động đặt drawable chính xác theo trạng thái của hộp kiểm.
jkincali

0

Hầu hết các câu trả lời đều đi qua tệp xml. Nếu bạn tìm thấy câu trả lời hoạt động cho hầu hết các phiên bản Android và chỉ có một màu cho hai trạng thái Kiểm tra UnCheck: đây là giải pháp của tôi:

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

-1

Có một cách dễ dàng hơn nhiều để thiết lập màu lập trình. Sử dụng phương thức bên dưới, Checkbox.setButtonTintList (ColorStateList.valueOf (getContext (). GetColor (R.color.yourcolor)))


-2

Bạn có thể sử dụng các dòng mã dưới đây để thay đổi nền của Hộp kiểm một cách linh hoạt trong mã java của bạn.

//Setting up background color on checkbox.
 checkbox.setBackgroundColor(Color.parseColor("#00e2a5"));

Câu trả lời này là từ trang web này . Bạn cũng có thể sử dụng trang web này để chuyển đổi màu RGB của mình thành giá trị Hex, bạn cần cung cấp cho parseColor

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.