前言:最近在做的项目中有一个筛选弹框,产品的意思是要做成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