介绍RadioButton控件特点,讲解获取控件返回结果的三种方法及优缺点。
RadioButton(单选按钮)是常用基本控件之一。一般由多个单选按钮组合为一组实现从多个选项中选取一项。为了在多个单选按钮中形成排他性选择,引入RadioGroup控件来实现单选按钮的分组,同组内的单选按钮具有排他性,不同组的单选按钮没有排他性关联。
01
获取单选按钮选中项
第14~43行定义一个容器RadioGroup,其内包含的RadioButton具有排他性,即同组内选中任意单选按钮都会导致其他单选按钮变为未选中状态。第29行指定radioButton2为选中状态。如果设为false或没有android:checked属性,则显示为未选中状态。
第16~46行定义了radioGroup1的OnCheckedChangeListener监听器,当radioGroup1中的单选按钮选中状态有变化时(不单是选中,取消选中也算选中状态变化),触发此监听器并调用监听器中的onCheckedChanged方法,变量checkedId代表被选中单选按钮的id。可使用下述3种方法获取选中单选按钮的文本。
第26~33行的方法一采用遍历radioGroup1中所有单选按钮的id是否等于checkedId,如果相等就返回相应单选按钮的文本。此方法采用一系列的if-else来判定选中的单选按钮,代码稍显烦琐。可以将if-else换成switch优化代码可读性。
第36~37行的方法二是将checkedId直接用findViewbyId方法找到对应的单选按钮。此方法的优点是简单明了,可以无视radioGroup1中单选按钮的数量;缺点是要依靠radioGroup1的OnCheckedChangeListener监听器获取checkedId。
第40~42行的方法三是对方法二的改进,通过radioGroup1的getCheckedRadioButtonId方法获取选中的单选按钮id。此方法可以不依赖radioGroup1监听器,推荐使用,特别适用于界面中同时有多个RadioGroup组成的单选按钮组,选定结果并提交时统一检查最终选定的单选按钮。
第15行是通过radioGroup1的check方法设置选中的单选按钮。需要注意,如果此行代码移动到setOnCheckedChangeListener方法之后,逻辑上变成radioGroup1先绑定OnCheckedChangeListener监听器,然后执行“radioGroup1.check(R.id.radioButton3);”,将会触发监听器3次(具体可查看RadioGroup的check方法源码):
(1) 如果已经有选中的单选按钮则设置为未选;
(2) 将当前选择的单选按钮设置为选中;
(3) 调用OnCheckedChangeListener监听器自己的方法。
程序运行的Logcat输出如下:
因此为避免check方法多次触发OnCheckedChangeListener监听器,应将check方法放在监听器之前。或者将代码“radioGroup1.check(R.id.radioButton3);”改成“radioButton3.setChecked(true);”,直接对radioButton3执行setChecked方法,此时将只触发radioGroup1的OnCheckedChangeListener监听器1次。
02
清空单选按钮
单选按钮一旦被选中,同一RadioGroup组中的所有单选按钮无法通过屏幕操作转为全部未选中状态,只能通过代码实现清空选择操作。本案例在4.5.1节案例的基础上增加一个按钮,在按钮单击监听器中执行清空单选按钮操作。
第16~29行button1的单击监听器中实现清空单选按钮的方法有如下两种。
方法一调用radioGroup1的clearCheck方法将同组内所有单选按钮都设置为未选。其优点是一条命令即可实现清空;缺点是如果设置了radioGgroup1的OnCheckedChangeListener监听器,clearCheck方法将会触发两次OnCheckedChangeListener监听器,第一次将选中的单选按钮设置为未选,第二次触发checkedId为-1的事件。值为-1的checkedId执行第39行返回的radioButton值为null,因此第43行对null值运行getText方法会抛出异常。为保证程序继续执行,第43行要用try-catch捕获异常并在第46行输出异常原因。单击“清空”按钮时,程序运行结果如下:
为避免触发两次监听器,可使用方法二。第25行通过radioGroup1的getChecked-RadioButtonId方法找到选中的单选按钮id。第26行通过id找到对应的单选按钮。第27行将单选按钮通过setChecked方法直接设置为false(注:此时radioGroup1的选中单选按钮id还是不变,可单击button2查看结果来验证,属于显示和属性值不同步的缺陷)。此时只触发radioGgroup1的OnCheckedChangeListener监听器一次。程序运行结果如下:
使用上述两种方式清空单选按钮,再单击button2,会出现两种不同的结果。对于方法一,第59行的radioButtonId为-1,不显示Toast。对于方法二,第59行的radioButtonId为执行清空前的单选按钮id值,所以会执行第62行显示Toast,并在Toast中显示清空前选中的单选按钮值。
【注】
一般很少用到清空单选按钮功能。如果用上述两种方法实现清空,一定要注意在下述两方面的局限性。
(1) OnCheckedChangeListener监听器的触发次数问题。
(2) 单选按钮显示状态与RadioGroup的getCheckedRadioButtonId方法返回值的不同步问题。
实例讲解
Android项目开发基础与实战
精彩回顾
教学辅助系统使用
Android项目开发相关Java基本概念
约束布局
TextView控件
Button控件
精彩预告
AlertDialog对话框
Activity
Broadcast
数据库调试
✦
03
视频讲解
扫码即可观看视频,限时免费3天
04
参考书籍
《Android项目开发基础与实战(微课视频版)》
作者:夏江
定价:59.9元
内容简介
本书结合作者多年讲授“Android应用软件开发”课程的教学经验,融入Android开发领域新技术,较为全面地介绍了Android应用软件开发的相关知识点和开发技巧。全书共分5章,分别介绍了Android开发环境、Android项目及Java基本概念、Android常用布局、Android常用控件和其他常用编程技术。本书相关案例以Android Studio为开发环境,尽可能使用最新版本SDK命令替代弃用命令,并对控件的版本变化做大致的介绍。本书全面考虑了本科教学的特点,结合作者开发的案例库教学辅助系统,通过精心设计的案例和详尽的讲解、演示,让读者感受体验式教学的魅力。本书适合Android Studio开发人员、Android的入门读者、高等学校学生使用,还可以作为高等院校、相关培训机构的教学用书。
05
精彩推荐
微信小程序游戏开发│猜数字小游戏(附源码+视频)
Flink编程基础│Scala编程初级实践
Flink编程基础│FlinkCEP编程实践
Flink编程基础│DataStream API编程实践
Flink编程基础│DataSet API编程实践
数 据分析实战│客户价值分析
数据分析实战│价格预测挑战
数据分析实战│时间序列预测
数据分析实战│KaggleTitanic生存预测