欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用RadioButton需要注意的几个地方

程序员文章站 2022-05-05 09:41:48
...

注意点一

使用RadioButton需要注意的几个地方

如图,在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

说明 RadioGroupclearCheck()方法也会执行到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)也可以做到。那么我们该如何选择呢?
使用RadioButton需要注意的几个地方

这次我们默认选中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)方法来实现比较好。