Android自定义RadioButton 第一次点击选中,再次点击取消状态,可与RadioGroup一起用

        前言:最近在做的项目中有一个筛选弹框,产品的意思是要做成CheckBox那种可以取消的,那为什么不直接用CheckBox呢?因为她有组合,一个组合里只能选中一个。为了懒,不想用几个CheckBox来判断选中状态,就在网上找了找看有没有现成的东西,但感觉都不满意,取消是可以做到,但没有提及在RadioGroup里只有一个可选中。

后来,我就去看了下RadioGroup的源码,看到了下面的一个一段:

上图中用红色框框起来的地方,我们看到RadioGroup只会认包裹的RadioButton子View。我之前自定义的RadioButton的是继承了CompoundButton的,这个CompoundButton

* <p>
* A button with two states, checked and unchecked. When the button is pressed
* or clicked, the state changes automatically.
* </p>

大概意思是一个具有选中、未选中两种状态的按钮,通过点击来切换状态。

但继承它我们的RadioGroup不认呀,怎么办呢? 既然RadioGroup只认RadioButton, 那我们继承RadioButton怎么样,have a try...  当然结果很棒,很完美,不用做过多的状态判断就能实现我们想要的效果了。

下面是自定义的ToggleRadioButton代码,用的自取:

/**
 * 自定义可取消radioButton,可与radioGroup一起用
 *
 * @author gjc
 * @version 1.0.0
 * @since 2018-05-30
 */

public class ToggleRadioButton extends android.support.v7.widget.AppCompatRadioButton {

    public ToggleRadioButton(Context context) {
        this(context, null);
    }

    public ToggleRadioButton(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.radioButtonStyle);
    }

    public ToggleRadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void toggle() {
        setChecked(!isChecked());
        if (!isChecked()) {
            ((RadioGroup)getParent()).clearCheck();
        }
    }
}

到这里就结束了吗? 还差一点。如果你这样做完之后并测试,并且你这么写你的选中状态改变监听:

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
    switch (group.getId()) {
        case R.id.rg_bind_status:
            switch (checkedId) {
                case R.id.rb_bind:
                    mBindStatus = "0";
                    break;
                case R.id.rb_unbind:
                    mBindStatus = "1";
                    break;
            }
            break;
    }
}

看着没什么错哦,但当你用的时候你会发现, 你点击了按钮选中一个,OK,没问题,确实mBindStatus赋值了,但是当你再次点击同一个按钮,状态是取消掉了,但是!!之前的赋值没有取消掉。

为了解决这个问题,我曾试了下if  else 判断选中,都没有选中的时候我们吧mBindStatus置为空。这样是没问题的,但意味着我要重新把这些都删掉,因为我已经写好了switch判断。所以我又懒了一下,在最后一个button后边家里三行:

case -1:  //都没有选中时
    mBindStatus = "";
    break;

这样,就很完美了。在布局里还是跟之前一样, 用RadioGroup包裹。

我参考的文章:

    https://blog.csdn.net/lr123838/article/details/75314683

    https://blog.csdn.net/yuan7016/article/details/78512747


猜你喜欢

转载自blog.csdn.net/gaoshang0304/article/details/80509880