使用RadioButton需要注意的几个地方
程序员文章站
2022-05-05 09:41:48
...
注意点一
如图,在RadioGroup
中放置两个单选按钮a和b,给RadioGroup
设置监听
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_a:
Log.i(TAG, "单选按钮A的状态变为:" + rbA.isChecked());
break;
case R.id.rb_b:
Log.i(TAG, "单选按钮B的状态变为:" + rbB.isChecked());
break;
case -1:
Log.i(TAG, "checkId = -1");
break;
}
}
});
先选中单选按钮a,再点击清除按钮
btnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rg.clearCheck();
}
});
打印日志如下:
I/RadioButtonActivity: 单选按钮a的状态变为:true
I/RadioButtonActivity: 单选按钮a的状态变为:false
I/RadioButtonActivity: checkedId = -1
说明 RadioGroup
的clearCheck()
方法也会执行到case R.id.rb_a:
的情况。
那么,这里我们就需要注意一点:
如果我们想用此监听方法监听“选中按钮”的动作,然后触发一些操作,我们就需要在case
语句下再加上一层对按钮当前状态的判断,因为取消选中同样会触发监听方法。 如下:
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_a:
if (rbA.isChecked()) {
// 选中a执行的操作
}
break;
case R.id.rb_b:
if (rbB.isChecked()) {
// 选中b执行的操作
}
break;
}
}
});
注意点二
将上面的清除按钮执行的代码换为:
btnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rbA.setChecked(false);
rbB.setChecked(false);
}
});
同样先选中单选按钮a,再点击清除按钮,打印日志:
I/RadioButtonActivity: 单选按钮a的状态变为:true
I/RadioButtonActivity: 单选按钮a的状态变为:false
可以看出少了一行,即checkedId
没有设置为-1。
此时,我们再点击单选按钮a时发现无法选中a了,但是如果点击单选按钮b却可以选中b。因为在RadioGroup中保存的checkedId
还是a的id,所以你点击按钮a是无法选中的,但是选择b则不影响。
所以,我们如果要清除RadioGroup
中所有的单选按钮的选中状态时,务必用clearCheck()
方法,而不是将单选按钮一个个的设置为未选中。
注意点三
有时我们需要用代码选中某个单选按钮,我们都知道可以直接用需要选中的按钮调用setChecked(true)
就可以实现,但是RadioGroup
中有个方法check(id)
也可以做到。那么我们该如何选择呢?
这次我们默认选中b,监听代码如“注意点一”中所述。首先用第一种方法选中a:
btnSelA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rbA.setChecked(true);
}
});
打印日志如下:
I/RadioButtonActivity: 单选按钮a的状态变为:true
再用RadioGroup
的方法check(id)
选中a:
btnSelA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rg.check(R.id.rb_a);
}
});
打印日志如下:
I/RadioButtonActivity: 单选按钮b的状态变为:false
I/RadioButtonActivity: 单选按钮a的状态变为:true
单选按钮a的状态变为:true
我们可以看出,后者使得监听方法调用了三次,一次是b的状态改变,a的状态改变则重复通知了两次。所以最好直接让需要选中的按钮调用setChecked(true)
方法来实现比较好。