使用Android中的颜色选择器设置复选框颜色

时间:2017-03-03 12:27:33

标签: android android-view android-styles android-checkbox

我在我的Android应用中使用颜色选择器为buttonTint设置属性Checkbox,以便在选中/取消选中时更改颜色。

以下是复选框样式的XML:

<style name="standard_checkbox">
    <item name="android:layout_marginLeft">@dimen/checkbox_small_margin</item>
    <item name="android:layout_marginRight">@dimen/checkbox_small_margin</item>
    <item name="buttonTint">@color/checkbox_standard_selector</item>
</style>

以下是选择器的XML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:color="@color/checkbox_checked" />
    <item android:state_checked="false" android:color="@color/checkbox_unchecked" />
</selector>

但它无法正常工作。 Checkbox首先变为可见时呈现正确的颜色(灰色)。单击/选中时,它会变得像它应该的绿色。但是当它再次被取消检查时,由于某种原因它仍然是绿色的。

修改

问题也可能是由于我在清单中选择了主题。我正在使用这个自定义主题:

<style name="Theme.Transparent.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

3 个答案:

答案 0 :(得分:1)

尝试以下代码:以编程方式更改checkbox按钮背景

CheckBox cb = (CheckBox) findViewById(R.id.checkbox);
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) { 
            buttonView.setBackgroundColor(getResources().getColor(R.color.checked));
            }
        if (!isChecked) { 
            buttonView.setBackgroundColor(getResources().getColor(R.color.unchecked)); 
            }
    }
});

N.B:getColor()已弃用,您需要使用ContextCompat.getColor(context, R.color.color)

第二种方式

使用您的颜色设置

创建一个颜色列表变量
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("#FFFFFF"),  //unchecked color
                Color.parseColor("#009000"),  //checked color
        }
);

使用以下设置颜色:setButtonTintList()

 CheckBox cb = (CheckBox) findViewById(R.id.checkbox);
 CompoundButtonCompat.setButtonTintList(cb,colorStateList);

答案 1 :(得分:1)

我和你有同样的问题,突然有了想法。为什么不使用选择器。所以我尝试了自己并且有效。

<强>解决方案:

如果您没有,请在res文件夹下创建颜色文件夹并放置此颜色选择器

<强> checkbox_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_checked="true" android:color="@color/colorPrimary" />
   <item android:state_checked="false" android:color="@color/colorSecondary" />
</selector>

在你的复选框内:

app:buttonTint="@color/checkbox_selector"

答案 2 :(得分:0)

我找到了一个解决方案,基于rafsanahmad007发布的一些代码。我创建了一个带有监听器的自定义复选框视图,根据自己的状态更改了色调颜色(已选中或未选中)。

自定义视图的代码:

import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.CompoundButtonCompat;
import android.util.AttributeSet;
import android.widget.CheckBox;
import android.widget.CompoundButton;

public class CustomCheckBox extends CheckBox implements CompoundButton.OnCheckedChangeListener {

    private OnCheckedChangeListener listener;
    private int currentColor;

    public CustomCheckBox(Context context, AttributeSet attrs) {
        super(context, attrs);
        super.setOnCheckedChangeListener(this);
        setCheckboxColor();
    }

    private void setCheckboxColor() {
        ColorStateList colorStateList = new ColorStateList(
                new int[][]{
                        new int[]{android.R.attr.state_enabled},
                },
                new int[]{
                        getCurrentColor()
                }
        );
        CompoundButtonCompat.setButtonTintList(this, colorStateList);
    }

    @Override
    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
        this.listener = listener;
    }

    public int getCurrentColor() {
        if (isChecked()) {
            return ContextCompat.getColor(getContext(), R.color.checkbox_checked);
        } else {
            return ContextCompat.getColor(getContext(), R.color.checkbox_unchecked);
        }
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        setCheckboxColor();
        if (listener != null) {
            listener.onCheckedChanged(buttonView, isChecked);
        }
    }
}