今天来聊聊我捣鼓CompoundButton
这玩意儿的过程。
我没太在意这个CompoundButton
,平时用CheckBox
、RadioButton
还有那个Switch
开关,用着用着也没多想。后来瞅眼继承关系,发现它们仨都是从CompoundButton
这儿来的,这CompoundButton
又是Button
的子类。,怪不得它们都能点,还有选中没选中这种状态。
摸索CheckBox
最先试的是CheckBox,就是那个复选框。这东西简单,拖一个到布局里,就能用。我想着得知道它到底被勾上没?翻翻,有个叫isChecked()
的方法,一用,果然能拿到是true
还是false
,挺直接。
然后就是,勾选状态变,我得知道,不然怎么响应操作?找到setOnCheckedChangeListener
,给它设个监听器。里面有个方法,每次状态一变,它就告诉我,顺便还能拿到最新的状态是我就在里面简单弹个Toast
提示,"选中"或者"取消选中",立马就能看到效果,挺好使。
- 拖个CheckBox到XML布局里。
- 用
findViewById
找到它。 - 用
setOnCheckedChangeListener
来监听状态变化。 - 在监听里面用
isChecked()
判断是选中还是取消。 - 发现CheckBox挺独立的,勾这个不影响那个,适合搞多选。
搞定RadioButton
接着是RadioButton,单选按钮。我一开始也像CheckBox那样,直接拖俩RadioButton放布局里。运行起来一点,怎么两个都能选上?这不对,单选按钮不就该是只能选一个吗?
卡一下,赶紧查查。原来,RadioButton得放一个叫RadioGroup的容器里头才行。它相当于给这几个RadioButton分个组,在一个组里的,就只能有一个被选中。我在XML里加个RadioGroup
,把那俩RadioButton
挪到它里面去。再跑一次,果然,点第二个的时候,第一个就自动弹起来,这才是单选该有的样子嘛
监听状态变化也差不多,可以用setOnCheckedChangeListener
,不过我发现监听RadioGroup
好像更方便点,它会告诉我哪个RadioButton被选中。或者,有时候我就是想在点某个确定按钮的时候,再去看哪个RadioButton被选中,那就直接在确定按钮的点击事件里,用getCheckedRadioButtonId()
拿到被选中的ID,再去找对应的RadioButton就行。
- 必须把多个RadioButton放在一个
RadioGroup
里,才能实现单选效果。 - 可以用
RadioGroup
的setOnCheckedChangeListener
来监听哪个按钮被选中。 - 或者需要的时候,用
getCheckedRadioButtonId()
主动去获取当前选中的是哪个。
试试Switch
是那个Switch开关。这玩意儿看着比CheckBox时髦点。用起来嘛感觉跟CheckBox差别不大。也是有isChecked()
判断开关状态,有setOnCheckedChangeListener
监听变化。用法上基本可以照搬CheckBox那套。
- 用起来和CheckBox很像,主要是外观不同。
- 同样用
isChecked()
和setOnCheckedChangeListener
。
总结一下
所以你看,这一圈搞下来,CheckBox
、RadioButton
、Switch
虽然长得不一样,用途也稍有区别(特别是RadioButton需要分组),但它们处理“选中”状态的核心逻辑,比如怎么判断状态(isChecked()
)、怎么监听状态变化(setOnCheckedChangeListener
)、怎么在代码里设置状态(setChecked()
),这些都是通用的,都是从老爹CompoundButton
那继承来的。
一开始我还把RadioButton当CheckBox用,忘加RadioGroup,算是踩个小坑。不过搞明白这个共同的爹是CompoundButton
之后,再用这几个控件就心里有底多。实践下来,感觉就是这么回事儿,不难,但细节得注意到。