2015-03-01 18 views
9

Sto creando una vista Casella di controllo ordinario:Variazione Casella colorAccent in fase di esecuzione di codice

<CheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

enter image description here

Questo verde chiaro (# A5D6A7) è dovuto il colore accento definito in stile principale:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="colorAccent">@color/green_light</item> 

Ho già trovato che non posso cambiare questo stile in runtime: How to set colorAccent in code?

Quello che voglio è cambiare questo colore su una casella di controllo specifica, non globalmente sull'app. Posso farlo senza creare una risorsa specifica? Perché l'utente sarà in grado di cambiare questo colore in runtime.

Grazie!

risposta

9

Uso AppcompatCheckbox

AppCompatCheckBox acb = (AppCompatCheckBox)findViewById(R.id.acb); 
ColorStateList colorStateList = new ColorStateList(
       new int[][]{ 

        new int[]{-android.R.attr.state_enabled}, //disabled 
        new int[]{android.R.attr.state_enabled} //enabled 
       }, 
       new int[] { 

        Color.RED //disabled 
        ,Color.BLUE //enabled 

       } 
     ); 

    acb.setSupportButtonTintList(colorStateList); 
+0

Con questa soluzione, fai clic è più lento del solito, ma funziona però! – Lera

+0

provare ad estendere AppCompatCheckBox, aggiungere codice colorstate; quindi vedi la performance @Lera –

+0

Non sono più in contatto con Android, alcuni di voi possono confermare se questa risposta risolve il problema pls? –

10

Questi codice funzionerà uniformemente senza rallentare controllo e comportamento deselezionare di checkbox.because checkbox.setSupportButtonTintList (colorStateList); si comporterà inaspettatamente su alcuni dispositivi

ColorStateList colorStateList = new ColorStateList(
         new int[][]{ 
           new int[]{-android.R.attr.state_checked}, // unchecked 
           new int[]{android.R.attr.state_checked} , // checked 
         }, 
         new int[]{ 
           Color.parseColor("#cccccc"), 
           Color.parseColor("##cccccc"), 
         } 
       ); 

CompoundButtonCompat.setButtonTintList(checkBox,colorStateList) 
+0

Ho appena incontrato il "comportamento inaspettato" che hai menzionato e questo codice ha salvato il giorno! Grazie mille per la condivisione! –

0

Questo funziona per me:

public void setCheckBoxColor(CheckBox checkBox, int checkedColor, int uncheckedColor) { 
    int states[][] = {{android.R.attr.state_checked}, {}}; 
    int colors[] = {checkedColor, uncheckedColor}; 
    CompoundButtonCompat.setButtonTintList(checkBox, new 
     ColorStateList(states, colors)); 
}