2015-12-17 14 views
5

Używam widoku CheckBox w systemie Android. Chciałbym zmienić jego kolor, gdy jest sprawdzany. W tej chwili jest to domyślny kolor ciemnozielony, gdy jest sprawdzony i chciałbym go zmienić na coś innego, a jeśli nie jest zaznaczone, po prostu być domyślnymi kolorami.Programowo zmieniający kolor zaznaczenia pola wyboru

Oto mój kod:

CheckBox c = new CheckBox(this); 
c.setId(View.generateViewId()); 

c.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if(buttonView.isChecked()) 
     { 
      buttonView.setBackgroundColor(Color.rgb(64, 131, 207)); 
     } 
     if(!buttonView.isChecked()) 
     { 
      buttonView.setBackgroundColor(Color.WHITE); 
     } 

    } 
}); 

Problemem jest to, że nie zmienia to słusznie. Wszelkie pomysły na zmianę tego koloru?

enter image description here

Odpowiedz

-2

Czy spróbować stworzyć selector i przypisać tę selector do swojej CheckBox tak na przykład:

//drawable file called cb_selector 
<?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/checked" /> 
    <item android:state_checked="false" android:drawable="@drawable/unchecked" /> 
</selector> 

W pliku układu zastosować ten plik na kwadracik

<CheckBox 
    android:id="@+id/myCheckBox" 
    android:text="My CheckBox" 
    android:button="@drawable/cb_selector" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

@drawable/checked i @drawable/unchecked są dwiema ges Twojego wyboru, więc można tam umieścić kolor, który chcesz

lub bez zmiany układu przycisków, z dodaniem tego atrybutu do wyboru

android:buttonTint="@color/YOUR_CHECKMARK_COLOR_HERE" 
+0

Dzięki. Wygląda na to, że to zadziała. – user1197993

+0

Nie ma za co :)) –

+0

To rozwiązanie nie będzie działało dla poziomu API 17 (i prawdopodobnie niczego poniżej API 21) – Boon

0
implement this file in res 

<?xml version="1.0" encoding="utf-8"?> 

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_checked="true" android:state_focused="true" 
    android:drawable="@drawable/checkbox_on_background_focus_yellow" /> 
<item android:state_checked="false" android:state_focused="true" 
    android:drawable="@drawable/checkbox_off_background_focus_yellow" /> 
<item android:state_checked="false" 
    android:drawable="@drawable/checkbox_off_background" /> 
<item android:state_checked="true" 
    android:drawable="@drawable/checkbox_on_background" /> 
</selector> 



and then add button to checkbox 

<CheckBox android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="new checkbox" 
android:background="@drawable/checkbox_background" 
android:button="@drawable/checkbox" /> 
7

zastąpić CheckBox z AppCompatCheckBox i rozmowy następujący sposób:

public static void setCheckBoxColor(AppCompatCheckBox checkBox, int uncheckedColor, int checkedColor) { 
    ColorStateList colorStateList = new ColorStateList(
      new int[][] { 
        new int[] { -android.R.attr.state_checked }, // unchecked 
        new int[] { android.R.attr.state_checked } // checked 
      }, 
      new int[] { 
        uncheckedColor, 
        checkedColor 
      } 
    ); 
    checkBox.setSupportButtonTintList(colorStateList); 
} 
+0

działało bez zarzutu! +1 – marlonpya

+2

Ostatnia linia powinna być "CompoundButtonCompat.setButtonTintList (checkBox, colorStateList)" –

+0

Jeśli to nie działa, zawiń 'uncheckedColor' z' ContextCompat.getColor (checkBox.getContext, uncheckedColor) 'i to samo z checkedColor – Linxy

2

o odcień CompoundButton Tints spróbować, zarówno dla API> 21 i poniżej.

if (Build.VERSION.SDK_INT < 21) { 
    CompoundButtonCompat.setButtonTintList(button, ColorStateList.valueOf(tintColor));//Use android.support.v4.widget.CompoundButtonCompat when necessary else 
} else { 
    button.setButtonTintList(ColorStateList.valueOf(tintColor));//setButtonTintList is accessible directly on API>19 
}