问题:全设置为false后再设置其中一个为true无效:
_butRange1.setChecked(false);
_butRange2.setChecked(false);
_butRange3.setChecked(false);
if(_selectedId>=0&&_selectedId<=2)
{
Log.v("RadioGroupTouchListener","onSelectedButton setChecked:"+_selectedId);
radios[_selectedId].setChecked(true);
}
原因:RadioGroup会对每个RadioButton添加监听,看源码:
private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// prevents from infinite recursion
if (mProtectFromCheckedChange) {
return;
}
mProtectFromCheckedChange = true;
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
mProtectFromCheckedChange = false;
int id = buttonView.getId();
setCheckedId(id);
}
}
关键的变量
mCheckedId
表示上次选中的单选框,也就是当点击另外一个单选框时,首先RadioButton会设置为true,然后RadioGroup会把之前选中的设为false。
public void check(@IdRes int id) {
// don't even bother
if (id != -1 && (id == mCheckedId)) {
return;
}
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
if (id != -1) {
setCheckedStateForView(id, true);
}
setCheckedId(id);
}
所以当我们手动对已勾选的radiobutton设为false,则会造成id=checkedId,所以再将目标设为true 则不会执行。
改正:
方法1:
直接对需要的radiobutton设为true,不需要对其他或本身先设为false
方法2:
使用radiogroup.checked(int id)
总结:
如果要自定义开关状态,不要用radiogroup装载radiobutton,直接用linearlayout