android RadioGroup中的RadioButton手动设置相关问题

来源:互联网 发布:淘宝店主寄语文艺 编辑:程序博客网 时间:2024/06/05 19:13

问题:全设置为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


0 0