Android RadioButton连续响应选中事件
2017-09-27 15:55
411 查看
多个button中只能选择一个,那么RadioButton+RadioGroup是一个很好的选择.比如在空调在工作模式上只能有一个选择,那么用radioButton是个很不错的选择。
但这样会有一个问题–如果别人将空调设置暖风,心情不爽的用户肯定会抓住机会再次点击冷风(自习室抢空调的日常)。这时用户就会惊奇的发现,不管他怎么点击,都没反应。为什么没反应,为什么没反应!因为程序猿用的是RadioButton!选中之后的radioButton,再次点击该按钮不会触发OnCheckedChangeListener.onCheckedChanged事件,这一点也反映在了该事件监听器的命名上。
这时候应该把radioButton控件换成Button,OnCheckedChangeListener改成OnClickListener吗?No,No,仔细一想,改成Button之后依然很麻烦,因为Button不具备某一组Button只能选中一个的功能,你必须自己维护Button的分组,而且选中一个button后重置上一个被选中的button的状态。更不用说在布局文件中的改动了。如果涉及的页面比较多,那么恭喜你,准备吃免费的加班餐吧。
更可怕的是,如果项目经理在不远的将来突然对你说,我们目前需要根据设备的当前状态实时的重置按钮的选中状态,为了减少后台的开销,按钮不能连续选中。这意味着你需要改回去,是不是很酸爽,哈哈。
大丈夫,大丈夫,让我们用苏格拉底的方式来思考这样一个问题,为什么用户会知道某个radioButton被选中了?因为背景色被改变了呀。那么可以代码设置背景色和radioButton的选中状态吗?当然可以。那么我可以在响应选中事件之后,代码将选中的radioButton置为未选中的状态,然后将背景色设置为选中色,这样就可以被再次选中了,而且对于用户来说,操作体验是不会变化的,因为用户能观察到的只是view层。
ok,上代码。
public class RadioButtonRestoreUtils {
public static void restoredRadioButton(@IdRes int checkedId, RadioGroup radioGroup, RadioGroup.OnCheckedChangeListener listener, Context mContext) {
radioGroup.setOnCheckedChangeListener(null);//checked监听事件失效
}
“`
radioGroup.setOnCheckedChangeListener(null);这段代码很重要,因为radioButton.setChecked(false);方法会再次触发OnCheckedChangeListener.onCheckedChanged事件。我们可以先将RadioGroup的监听事件保存下来(即restoredRadioButton方法中的参数this),同时将其监听事件置空,修改完radioButton的状态后,再重新赋值。就算项目经理以后取消了连续选择需求,我们只需要让restoredRadioButton这个方法什么都不做就OK了,是不是很炫酷,哈哈哈。
其实,个人认为最好是自定义一个RadioGroup和RadioButton,这样可以更加完美的应对需求变化。希望我在国庆期间可以想起来这件事情。
源码下载
有用的话,麻烦各位看官点个赞<3<3
但这样会有一个问题–如果别人将空调设置暖风,心情不爽的用户肯定会抓住机会再次点击冷风(自习室抢空调的日常)。这时用户就会惊奇的发现,不管他怎么点击,都没反应。为什么没反应,为什么没反应!因为程序猿用的是RadioButton!选中之后的radioButton,再次点击该按钮不会触发OnCheckedChangeListener.onCheckedChanged事件,这一点也反映在了该事件监听器的命名上。
这时候应该把radioButton控件换成Button,OnCheckedChangeListener改成OnClickListener吗?No,No,仔细一想,改成Button之后依然很麻烦,因为Button不具备某一组Button只能选中一个的功能,你必须自己维护Button的分组,而且选中一个button后重置上一个被选中的button的状态。更不用说在布局文件中的改动了。如果涉及的页面比较多,那么恭喜你,准备吃免费的加班餐吧。
更可怕的是,如果项目经理在不远的将来突然对你说,我们目前需要根据设备的当前状态实时的重置按钮的选中状态,为了减少后台的开销,按钮不能连续选中。这意味着你需要改回去,是不是很酸爽,哈哈。
大丈夫,大丈夫,让我们用苏格拉底的方式来思考这样一个问题,为什么用户会知道某个radioButton被选中了?因为背景色被改变了呀。那么可以代码设置背景色和radioButton的选中状态吗?当然可以。那么我可以在响应选中事件之后,代码将选中的radioButton置为未选中的状态,然后将背景色设置为选中色,这样就可以被再次选中了,而且对于用户来说,操作体验是不会变化的,因为用户能观察到的只是view层。
ok,上代码。
mModeGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { switch (checkedId){ //相关操作 } //this 代表的是OnCheckedChangeListener对象 RadioButtonRestoreUtils.restoredRadioButton(checkedId,group,this,MainActivity.this); } });``` RadioButtonRestoreUtils是我封装的一个类,方便在其他的类中使用。上代码
public class RadioButtonRestoreUtils {
public static void restoredRadioButton(@IdRes int checkedId, RadioGroup radioGroup, RadioGroup.OnCheckedChangeListener listener, Context mContext) {
radioGroup.setOnCheckedChangeListener(null);//checked监听事件失效
RadioButton radioButton = (RadioButton) radioGroup.findViewById(checkedId); //清除radioButton的选中状态,只保留背景色 radioButton.setClickable(true); radioButton.setChecked(false); int childCount = radioGroup.getChildCount(); RadioButton childAt = null; //将所有radioButton背景色置为未选中状态,目的是清除之前的设置 for (int i = 0; i < childCount; i++) { childAt = (RadioButton) radioGroup.getChildAt(i); childAt.setBackgroundResource(R.drawable.ih_airconditioner_tv_normal); childAt.setTextColor(mContext.getResources().getColor(R.color.device_text_color_normal)); } //将之前选中的radioButton背景色设为选中状态 radioButton.setBackgroundResource(R.drawable.ih_airconditioner_tv_focused); radioButton.setTextColor(mContext.getResources().getColor(R.color.device_text_color_focus)); radioGroup.setOnCheckedChangeListener(listener);//重新添加 }
}
“`
radioGroup.setOnCheckedChangeListener(null);这段代码很重要,因为radioButton.setChecked(false);方法会再次触发OnCheckedChangeListener.onCheckedChanged事件。我们可以先将RadioGroup的监听事件保存下来(即restoredRadioButton方法中的参数this),同时将其监听事件置空,修改完radioButton的状态后,再重新赋值。就算项目经理以后取消了连续选择需求,我们只需要让restoredRadioButton这个方法什么都不做就OK了,是不是很炫酷,哈哈哈。
其实,个人认为最好是自定义一个RadioGroup和RadioButton,这样可以更加完美的应对需求变化。希望我在国庆期间可以想起来这件事情。
源码下载
有用的话,麻烦各位看官点个赞<3<3
相关文章推荐
- 解决Android中Listview条目里面有checkbox、radiobutton无法响应条目点击事件
- android 防止Button连续点击而响应多次点击事件
- Android 中如何才能让 StackView 的 OnItemSelectedListener 侦听器响应选中事件
- android 一个控件设置了事件响应(比如Button添加了OnClick回调响应),却在触发控件事件时,不执行事件处理函数
- 【Android】控件和基本事件响应的三种方式
- android响应事件(按钮)的三种方式
- android radioButton 选中后改变字体颜色样式
- Android开发之新版百度map的调用(二):map中添加覆盖物及响应事件和弹出POP功能
- Android对触摸屏、键盘、轨迹球事件的响应过程
- WPF中ListBox连续选择同一项时SelectionChanged 事件不响应的问题
- Android_ExpandableListView_子item响应点击事件
- android Animation动画平移之后不响应点击事件
- Android中的EditText失去和得到焦点时的事件响应
- Android EditText setOnClickListener事件 只有获取焦点才能响应 采用setOnTouchListener解决
- Android防止点击过快造成多次响应事件的解决方法
- android framelayout两布局重叠,如何让下层不响应事件
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——5.5 响应用户的多指触控事件(缩放)
- Android 手机卫士--事件传递&响应规则
- Android使用WebView的,响应网页的JavaScript事件
- Android在xml中设置点击事件不响应