Come cambiare il colore di un CheckBox?


247

Come posso cambiare il CheckBoxcolore predefinito in Android?
Di default il CheckBoxcolore è verde e voglio cambiarlo.
Se non è possibile, per favore dimmi come fare un'abitudine CheckBox?


1
Stai cercando di cambiare il colore del carattere? O il colore della scatola reale?

1
colore della scatola reale che cambio
Piyush

72
L'impostazione di android:buttonTint="@color/mybrown"è un modo semplice per cambiare il colore della scatola.
Shauvik,

6
@Shauvik funziona solo sulla progettazione dei materiali :)
Mucahit,

9
@shauvik è meglio usare app:buttonTint="@color/mybrown"invece, in questo modo può funzionare su API <21
Nikaoto

Risposte:


187

Se hai più di minSdkVersion21 anni usa l' android:buttonTintattributo per aggiornare il colore di una casella di controllo:

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

Nei progetti che utilizzano la libreria AppCompat e supportano le versioni di Android inferiori a 21 è possibile utilizzare una versione compatibile buttonTintdell'attributo:

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

In questo caso, se si desidera effettuare una sottoclasse a CheckBox, non dimenticare di utilizzare AppCompatCheckBoxinvece.

RISPOSTA PRECEDENTE:

Puoi cambiare CheckBoxs drawable usando l' android:button="@drawable/your_check_drawable"attributo.


7
Dovresti creare il tuo disegno. Deve esserci un modo più diretto ...
IgorGanapolsky,

14
Modifica del pulsante Il colore della tonalità è un modo più semplice. Dobbiamo usare gli elementi nativi invece di personalizzarli inutilmente.
Neela,

3
Nota: per lo stile di progettazione dei materiali, ora sono disponibili le contentControlopzioni: materialdoc.com/components/selection-controls
SimpsOff

392

Puoi cambiare il colore direttamente in XML. Utilizzare buttonTintper la scatola: (a partire dal livello API 23)

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

Puoi anche farlo usando appCompatCheckbox v7per i livelli API precedenti:

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

5
AppCompatCheckBox ... Grazie. Non lo sapevo.
moskis,

8
Bene grazie! E non dimenticare di aggiungere xmlns: app = " schemas.android.com/apk/res-auto " al layout principale / principale
Alberto Méndez

2
Non funziona per me utilizzando 'android.support.v7.widget.AppCompatCheckBox'
Zvi

1
Questo verrà utilizzato automaticamente quando si utilizza CheckBox nei layout. Dovresti solo utilizzare questa classe manualmente quando scrivi viste personalizzate.
최봉재

2
Che ne dici di impostare 2 colori diversi per gli stati controllati e non selezionati?
DYS,

130

puoi impostare il tema Android della casella di controllo per ottenere il colore desiderato nel tuo styles.xml aggiungere:

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

quindi nel tuo file di layout:

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

a differenza dell'uso di android:buttonTint="@color/CHECK_COLOR"questo metodo funziona con Api 23


5
TEXTCOLORSECONDARY !!!! Grazie amico! Questo è tutto. Ho cercato per anni solo per cambiare il colore di sfondo non selezionato e non volevo lavorare con disegnabili personalizzati. Questo è!
Mulgard,

@Mulgard felice di poterti aiutare!
Amro elaswar,

2
Ha funzionato per me, ma dovevo aggiungere al CheckBox xml per poter vedere il testo - android: textColor = "@ color / textColor"
Zvi

Come posso farlo anche a livello di codice?
Zvi,

@Zvi Non sono sicuro che tu possa farlo in modo programmatico
Amro elaswar,

48

Versione programmatica:

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
Grazie a te. Sassi, la soluzione migliore.
Carlos,

mi ha dato un risultato inaspettato con i colori, sei sicuro di non aver confuso nulla?
Kirill Karmazin,

@Carlos Questa non è una soluzione "migliore", perché in Android dovresti sempre provare a impostare tutto il layout nel file xml e non a livello di programmazione tranne quando è necessario modificarlo in modo dinamico
kyay

@kyay Non "sempre" ... il sistema di risorse Android è un casino e spesso farlo a livello di codice è molto più semplice e più gestibile.
nyholku,

Aiuta in qualche modo a separare le preoccupazioni
kyay

42

Utilizzare buttonTintper cambiare il colore del pulsante e del selettore del colore per versioni api superiori a 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 / colori / 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
Si può parlare inglese e spiegare la tua risposta plse
GGO

Rimani sempre con l'inglese in SO.
recitando il

È una risposta migliore
Vivek A Naik,

Questo sembra essere l'unico approccio semplice per impostare sia i colori controllati che non controllati che funziona su tutti i dispositivi.
Gumby The Green

Questa dovrebbe essere la risposta accettata. Anche se va notato che non funziona quando il selettore viene dichiarato come valuesrisorsa. Come indicato dal percorso mostrato sopra, deve trovarsi nella colorscartella delle risorse.
Benjamin Basmaci,

18

Suggerirei di utilizzare il suo approccio di stile in Android come modo per configurare le visualizzazioni Android integrate, aggiungere un nuovo stile nel tuo progetto:

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

e aggiungi assegna questo stile al tema della casella di controllo: android: theme = "@ style / youStyle"

spero che questo ti aiuti.


d'accordo con questa soluzione, quegli attributi dovrebbero funzionare meglio con il componente Android predefinito predefinito senza problemi sul disegnabile come la risposta votata.
Trung Le

1
Questa è una ripetizione della risposta di Amro elaswar di 9 mesi prima.
jk7,

Questo è il tipo di soluzione che è UNA SOLUZIONE REALE.
Iharob Al Asimi,

16

Aggiungi buttonTint nel tuo 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" />

2
Il contenuto di questa risposta esiste già nella risposta di Afathman .
MTCoster,

10

Aggiungi questa riga nel tuo styles.xmlfile:

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

Modifica la tua risposta con il tuo esempio e non pubblicarla come commento
bish

4
Leggera correzione: <item name = " android : colorAccent> </item>. Inoltre, questo è disponibile solo dall'API 21 in poi.
user3829751

questo cambia il coloreAccent, non è quello che è stato chiesto
Alberto M

1
Su Galaxy S3 cambia solo lo stato controllato di un CheckBox. Ma lo stato non controllato è sempre lo stesso.
Slava,

9

buttonTint ha funzionato per me provare

Android: buttonTint = "@ colore / bianco"

<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

Ho affrontato lo stesso problema, ho ottenuto una soluzione utilizzando la tecnica di seguito. Copia il btn_check.xmlda android-sdk/platforms/android-#(version)/data/res/drawablenella cartella disegnabile del tuo progetto e modifica gli stati delle immagini "on" e "off" in immagini personalizzate.
Quindi il tuo XML avrà solo bisognoandroid:button="@drawable/btn_check"

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

Se si desidera utilizzare diverse icone Android predefinite, è possibile utilizzare:

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

Ottima risposta - molto più semplice della creazione di xml personalizzati .. grazie! Per me, ho uno sfondo grigio e il bordo della casella di controllo non era visibile. Ho aggiunto questo e lo puoi vedere ora: android: button = "@ android: drawable / checkbox_off_background"
Gene Bo

1
In realtà c'è un po 'di più nell'uso di questo approccio di quanto pensassi ... ma comunque una buona opzione. Ho aggiunto i dettagli sotto stackoverflow.com/a/29831532/2162226
Gene Bo

5

Puoi cambiare checkboxcolore usando la riga di codice singola

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


4

Approccio robusto al 100%.

Nel mio caso, non avevo accesso al file di origine del layout XML, poiché ottengo Checkbox da una libreria MaterialDialog di terze parti. Quindi devo risolverlo a livello di codice.

  1. Crea una 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>
  1. Quindi applicalo alla casella di controllo:

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

PS Inoltre, se qualcuno è interessato, ecco come ottenere la casella di controllo dalla finestra di dialogo MaterialDialog (se impostata con .checkBoxPromptRes(...)):

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

Spero che questo ti aiuti.


3

crea un xml Drawable resource filesotto res->drawablee nominalo, ad esempio,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>

Carica i tuoi file di immagine della casella di controllo personalizzati (consiglio png) nella tua res->drawablecartella.

Quindi vai nel tuo file di layout e cambia la casella in

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

puoi personalizzare qualsiasi cosa, purché android:buttonpunti sul file XML corretto che hai creato in precedenza.

NOTA PER I PRINCIPALI: sebbene non sia obbligatorio, è comunque buona norma assegnare un nome alla casella con un ID univoco nell'intero albero del layout.


3

Ciao Questo è il codice tema sia per il tema scuro che per il tema chiaro.

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

Se si desidera cambiare il colore della casella di controllo, l'attributo "colorAccent" verrà utilizzato per lo stato selezionato e "android: textColorSecondary" verrà utilizzato per lo stato di deselezione.

"actionOverflowButtonStyle" verrà utilizzato per modificare il colore dell'icona di overflow nella barra delle azioni.

L'attributo "buttonsearch_picture" verrà utilizzato per cambiare il colore della tinta del pulsante Azione nella barra delle azioni. Questo è l'attributo personalizzato in style.xml

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

Lo stesso vale per il pulsante di aggiornamento che sto utilizzando nella mia app.

L'attributo "android: popupMenuStyle" viene utilizzato per ottenere lo stile del menu popup del tema Light nel tema Dark.

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

E questo è il codice della barra degli strumenti che sto usando nella mia app Rocks Player.

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

Temi: -

 <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

puoi creare il tuo xml in drawable e usarlo come android: background = "@ drawable / your_xml"

in quanto puoi dare tutto all'angolo del bordo

<item>
    <shape>
        <gradient

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

    </shape>
</item>


1
Sebbene sia interessante conoscere la grafica vettoriale disegnabile, questa risposta non risponde alla domanda dell'OP sulla tinta dei pulsanti.
Mike Poole,

2

È possibile utilizzare le seguenti due proprietà in "colors.xml"

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

colorControlNormal è per la normale visualizzazione della casella di controllo e colorControlActivated è per quando la casella di controllo è selezionata.


1

È possibile modificare il colore di sfondo di <CheckBox>incorporandolo in a <LinearLayout>. Quindi cambia il colore di sfondo <LinearLayout>con il colore che desideri.


La domanda riguarda il colore della casella di controllo e non lo sfondo
Zvi,

1

Dovresti provare sotto il codice. Funziona per 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>

e 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

Se hai intenzione di utilizzare le icone Android, come descritto sopra.

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

.. è una buona opzione, ma per farlo funzionare - ho scoperto che è necessario aggiungere la logica di attivazione / disattivazione per mostrare / nascondere il segno di spunta, in questo modo:

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

        }
    });

Bene, questo è un lavoro extra che in realtà non è necessario. Nel file XML del disegno si forniscono riferimenti a risorse di disegno acceso o spento per il selettore. Questo inserisce automaticamente il disegno corretto in base allo stato della casella di controllo.
jkincali,

0

La maggior parte delle risposte passa attraverso il file xml. Se trovi una risposta attiva per la maggior parte delle versioni di Android e hai solo un colore per i due stati Controlla un UnCheck: ecco la mia soluzione:

Kotlin:

val colorFilter = PorterDuffColorFilter(Color.CYAN, PorterDuff.Mode.SRC_ATOP)
CompoundButtonCompat.getButtonDrawable(checkBox)?.colorFilter = colorFilter

Giava:

ColorFilter colorFilter = new PorterDuffColorFilter(Color.CYAN, PorterDuff.Mode.SRC_ATOP);
Drawable drawable = CompoundButtonCompat.getButtonDrawable(checkBox);
if (drawable != null) {
    drawable.setColorFilter(colorFilter);
}

-1

C'è un modo molto più semplice per impostare il colore a livello di codice. Utilizzare il metodo seguente, Checkbox.setButtonTintList (ColorStateList.valueOf (getContext (). GetColor (R.color.yourcolor)))


-2

È possibile utilizzare le seguenti righe di codice per modificare dinamicamente lo sfondo della casella di controllo nel codice java.

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

Questa risposta è stata da questo sito . È inoltre possibile utilizzare questo sito per convertire il colore RGB nel valore esadecimale, è necessario alimentare il parseColor

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.