compoundbutton的几种类型,彻底搞懂CheckBox和RadioButton

吉云

今天来聊聊我捣鼓CompoundButton这玩意儿的过程。

我没太在意这个CompoundButton,平时用CheckBoxRadioButton还有那个Switch开关,用着用着也没多想。后来瞅眼继承关系,发现它们仨都是从CompoundButton这儿来的,这CompoundButton又是Button的子类。,怪不得它们都能点,还有选中没选中这种状态。

摸索CheckBox

compoundbutton的几种类型,彻底搞懂CheckBox和RadioButton

最先试的是CheckBox,就是那个复选框。这东西简单,拖一个到布局里,就能用。我想着得知道它到底被勾上没?翻翻,有个叫isChecked()的方法,一用,果然能拿到是true还是false,挺直接。

然后就是,勾选状态变,我得知道,不然怎么响应操作?找到setOnCheckedChangeListener,给它设个监听器。里面有个方法,每次状态一变,它就告诉我,顺便还能拿到最新的状态是我就在里面简单弹个Toast提示,"选中"或者"取消选中",立马就能看到效果,挺好使。

  • 拖个CheckBox到XML布局里。
  • findViewById找到它。
  • setOnCheckedChangeListener来监听状态变化。
  • compoundbutton的几种类型,彻底搞懂CheckBox和RadioButton

  • 在监听里面用isChecked()判断是选中还是取消。
  • 发现CheckBox挺独立的,勾这个不影响那个,适合搞多选。

搞定RadioButton

接着是RadioButton,单选按钮。我一开始也像CheckBox那样,直接拖俩RadioButton放布局里。运行起来一点,怎么两个都能选上?这不对,单选按钮不就该是只能选一个吗?

卡一下,赶紧查查。原来,RadioButton得放一个叫RadioGroup的容器里头才行。它相当于给这几个RadioButton分个组,在一个组里的,就只能有一个被选中。我在XML里加个RadioGroup,把那俩RadioButton挪到它里面去。再跑一次,果然,点第二个的时候,第一个就自动弹起来,这才是单选该有的样子嘛

compoundbutton的几种类型,彻底搞懂CheckBox和RadioButton

监听状态变化也差不多,可以用setOnCheckedChangeListener,不过我发现监听RadioGroup好像更方便点,它会告诉我哪个RadioButton被选中。或者,有时候我就是想在点某个确定按钮的时候,再去看哪个RadioButton被选中,那就直接在确定按钮的点击事件里,用getCheckedRadioButtonId()拿到被选中的ID,再去找对应的RadioButton就行。

  • 必须把多个RadioButton放在一个RadioGroup里,才能实现单选效果。
  • 可以用RadioGroupsetOnCheckedChangeListener来监听哪个按钮被选中。
  • 或者需要的时候,用getCheckedRadioButtonId()主动去获取当前选中的是哪个。

compoundbutton的几种类型,彻底搞懂CheckBox和RadioButton

试试Switch

是那个Switch开关。这玩意儿看着比CheckBox时髦点。用起来嘛感觉跟CheckBox差别不大。也是有isChecked()判断开关状态,有setOnCheckedChangeListener监听变化。用法上基本可以照搬CheckBox那套。

  • 用起来和CheckBox很像,主要是外观不同。
  • 同样用isChecked()setOnCheckedChangeListener

compoundbutton的几种类型,彻底搞懂CheckBox和RadioButton

总结一下

所以你看,这一圈搞下来,CheckBoxRadioButtonSwitch虽然长得不一样,用途也稍有区别(特别是RadioButton需要分组),但它们处理“选中”状态的核心逻辑,比如怎么判断状态(isChecked())、怎么监听状态变化(setOnCheckedChangeListener)、怎么在代码里设置状态(setChecked()),这些都是通用的,都是从老爹CompoundButton那继承来的。

一开始我还把RadioButton当CheckBox用,忘加RadioGroup,算是踩个小坑。不过搞明白这个共同的爹是CompoundButton之后,再用这几个控件就心里有底多。实践下来,感觉就是这么回事儿,不难,但细节得注意到。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]