关于RadioGroup的BUG分析

关于RadioGroup的BUG分析

问题的产生

之前一直知道RadioGroup有一个BUG,就是不能在xml里给组里的RadioButton设置默认状态为选中,否则怎么这个RadioButton会一直保持选中状态。
而最近最项目使用RadioGroup遇到另外一个更奇怪的问题:

项目里有一个A页面需要动态添加选项卡,跳转到一个排序界面返回后需要重新初始化选项卡,这里我是用的RadioGroup来实现。但是我发现当A页面默认选中第一个选项,跳转到排序界面后返回A页面,重新初始化RadioGroup,设置第一个选项卡为默认选中,却怎么也选不中。所以跑到RadioGroup里瞧了瞧源码,终于发现了事情的真相。

关键源码

private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // prevents from infinite recursion
            if (mProtectFromCheckedChange) {
                return;
            }
            // 选中改变保护,保证不会无限循环事件
            mProtectFromCheckedChange = true;
            // 如果当前选中id不等于-1,则将其对应的RadioButton设置为false
            if (mCheckedId != -1) {
                setCheckedStateForView(mCheckedId, false);
            }
            mProtectFromCheckedChange = false;

            // 设置当前选中id
            int id = buttonView.getId();
            setCheckedId(id);
        }
    }

问题分析

看到上面的代码应该很清楚了,RadioGroup有一个变量mCheckedId来保存当前选中的RadioButton的id。那么第一个问题就清楚了,在RadioGroup初始化的时候并不会根据解析的xml来判断哪一个RadioButton是被设置成选中状态,也就是没有给mCheckedId赋值,所以这个RadioButton永远都会是选中状态。
第二个就是关于我开发中遇到的问题,如果在第二次初始化前,mCheckedId是1,在修改排序后,我们想要设置id为1的RadioButton设置为选中,这段代码就会先把mCheckedId对应的RadioButton先设置为false,所以第一个怎么也选不中。解决办法就是在初始化前调用一次RadioGroup的clearCheck()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值