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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值