您的位置:首页 > 移动开发 > Android开发

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

2017-05-18 23:24 477 查看
项目中遇到一个问题,需要使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_laoh
4000
ua = (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)就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐