关于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()方法。