我在我的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>
答案 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);
}
}
}