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

来源:互联网 发布:5位电话 知乎 编辑:程序博客网 时间:2024/04/30 02:39

项目中遇到一个问题,需要使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)就可以了。

阅读全文
1 0
原创粉丝点击