Android 实现三个TextInputLayout绑定同一监听器的单选背景切换
原代码问题定位
你的现有逻辑之所以无法实现直接跨控件单选切换,核心是两个设计缺陷:
- 引入了
mStateChanged全局状态标记,同时强行将未选中的控件通过setClickable(false)禁用点击响应,相当于锁死了其他控件的点击入口,必须先手动点当前选中项解锁,才能响应其他控件的点击 - 没有统一的选中状态维护机制,每个控件的选中逻辑都是独立的if分支,完全不清楚当前哪一个控件处于激活状态,更做不到自动重置之前的选中项状态
实现目标逻辑的核心思路
完全不需要禁用任何控件的点击能力,不需要额外的全局状态判断,遵循两步走的通用单选实现逻辑即可:
- 每次触发任意一个控件的点击事件时,先遍历所有待选控件,统一将背景重置为默认未选中样式
- 给当前被点击的控件单独设置选中态的背景样式
优化后的可运行代码
建议将三个待选控件统一收纳为列表,大幅减少重复判断的代码量:
// 初始化所有选项控件的集合,后续新增选项只需要往这个列表里加即可 List<View> optionList = Arrays.asList(mLoseWgt, mBuildMuscle, mFittedToned); View.OnClickListener commonClickListener = new View.OnClickListener() { @Override public void onClick(View v) { // 第一步:批量重置所有控件为默认样式 for (View option : optionList) { option.setBackgroundResource(R.drawable.textview_outline_style); // 如果有文字颜色随选中态变化的需求,在这里同步重置为默认文字色即可 } // 第二步:给当前点击的控件设置选中样式 v.setBackgroundResource(R.drawable.textview_after_click); } }; // 统一给所有控件绑定监听器 for (View option : optionList) { option.setOnClickListener(commonClickListener); }
方案效果说明
- 不管之前哪个控件是选中状态,只要直接点击其他任意控件,就会自动把之前的选中项还原为默认样式,同时把新点击的控件切换为选中态
- 全程没有禁用任何控件的点击权限,不需要先点当前选中项做“取消”操作,完全匹配单选交互的预期
- 彻底删掉了原来冗余的
mStateChanged变量、反复设置setClickable的互锁逻辑,后续如果要新增更多选项,只需要把新的控件实例加到optionList集合里就行,不用写重复的if判断分支
注意:该逻辑对TextInputLayout完全通用,不需要额外适配组件类型。
内容的提问来源于stack exchange,提问作者Mubashar Hassan Minhas
相关产品推荐
相关产品推荐

