Android实现RadioGroup中的RadioButton再次点击取消选中

项目中遇到一个问题,需要使RadioGroup中的RadioButton在点击已选中的button时使其变为未选中。

网上找了一些解决方案,不是很理想,最后自己用CheckBox加一些控制逻辑实现了上述效果。

示例:

layout文件:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:orientation="horizontal"
        android:paddingLeft="10dp">

        <CheckBox
            android:id="@+id/id_cb_laohua"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:background="@drawable/cb_background"
            android:gravity="center"
            android:text="老化"
            android:textSize="20sp" />

        <CheckBox
            android:id="@+id/id_cb_texing"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:background="@drawable/cb_background"
            android:text="特性"
            android:textSize="20sp" />

        <CheckBox
            android:id="@+id/id_cb_pingce"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:background="@drawable/cb_background"
            android:gravity="center"
            android:text="评测"
            android:textSize="20sp" />

    LinearLayout>

Java代码

        cb_laohua = (CheckBox) view.findViewById(R.id.id_cb_laohua);typeCheckBoxList.add(cb_laohua);
        cb_texing = (CheckBox) view.findViewById(R.id.id_cb_texing);typeCheckBoxList.add(cb_texing);
        cb_pingce = (CheckBox) view.findViewById(R.id.id_cb_pingce);typeCheckBoxList.add(cb_pingce);
        //三个CheckBox使用同一个监听
        TypeCheckBoxListener typeCheckBoxListener = new TypeCheckBoxListener();
        cb_laohua.setOnCheckedChangeListener(typeCheckBoxListener);
        cb_texing.setOnCheckedChangeListener(typeCheckBoxListener);
        cb_pingce.setOnCheckedChangeListener(typeCheckBoxListener);

        .....

    /**
     * 将一组CheckBox设置同一个监听器对象
     * 在监听器中监听发生状态改变的CheckBox,经过一系列判断
     * 通过对静态全局变量赋值的形式将用户的最终选择传递出去
     *
     * 注意:由于要模拟RadioGroup+RadioButton的效果,所以要做到以下两点:
     * 1. 一组按钮只能同时选中一个
     * 2. 点击已选中的按钮要能够取消选中
     *
     * 实现要点:每次触发监听时检查是否有按钮被选中,如果没有,直接赋值然后return。如果有,判断该次触发是选中还是取消选中
     * 如果是取消选中,不执行任何逻辑。如果是选中,则赋值出去,然后将其他的按钮置false。这个时候之前选中的按钮由于被置false,
     * 状态发生改变,所以会再触发一次监听。但由于其状态是false,所以不会执行任何逻辑。这点很重要,所以前面赋值出去前一定要先检查状态
     * 如果为false,就不要再对赋值进行任何改变了。
     *
     */
         private class TypeCheckBoxListener implements CompoundButton.OnCheckedChangeListener{
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (!cb_laohua.isChecked()&&!cb_texing.isChecked()&&!cb_pingce.isChecked()){
                type = 0;
                return;
            }
            switch (buttonView.getId()){
                case R.id.id_cb_laohua:
                    if (isChecked) {
                        type = R.id.id_cb_laohua;
                        cb_texing.setChecked(false);
                        cb_pingce.setChecked(false);
                    }
                    break;
                case R.id.id_cb_texing:
                    if (isChecked) {
                        type = R.id.id_cb_texing;
                        cb_laohua.setChecked(false);
                        cb_pingce.setChecked(false);
                    }
                    break;
                case R.id.id_cb_pingce:
                    if (isChecked) {
                        type = R.id.id_cb_pingce;
                        cb_laohua.setChecked(false);
                        cb_texing.setChecked(false);
                    }
                    break;
            }
        }
    }

上述代码中,通过对全局变量type的赋值来将用户的选择传递出去,给其他方法使用。

妈蛋,怎么MarkDown的格式到处都不一样啊,代码格式每次都要调整。

2017.05.24 更新:
今天重看项目中的这块代码,突然觉得好傻逼,搞这么复杂的逻辑判断。直接RadioGroup+RadioButton+少量逻辑判断不就好了嘛!每次点击RadioButton后先判断下自身的状态,如果是checked,那么直接setChecked(false),如果是unChecked,说明同组有别的item被check了,那就调用RadioGroup的clearCheck(),然后再对自己setChecked(true)就可以了。

你可能感兴趣的:(Android实现RadioGroup中的RadioButton再次点击取消选中)