为什么CheckBox的OnCheckedChangeListener中afterscan方法被异常触发?
问题根因
你将同一个OnCheckedChangeListener实例绑定给了所有CheckBox控件,任意CheckBox的勾选状态变更都会触发onCheckedChanged回调。当前代码仅校验了checkBoxer是否处于勾选状态,没有判断本次触发回调的控件是否为checkBoxer本身,所以只要checkBoxer已经被勾选,其他CheckBox的操作触发回调时都会执行afterscan()。
修复方案
方案1:校验触发回调的控件身份
在调用afterscan()前新增判断,只有本次触发回调的是checkBoxer时才执行对应逻辑,修改后代码如下:
class Chk_class implements CompoundButton.OnCheckedChangeListener{ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { result=new StringBuilder(); if(checkBox2.isChecked()) { result.append("Connection issue |"); } if(checkBox4.isChecked()) { result.append("Machnical issue |"); } Toast toast = Toast.makeText(getApplicationContext(), result.toString(), Toast.LENGTH_SHORT); toast.setGravity(Gravity.TOP, 0, 0); toast.show(); liftError=result.toString(); // 新增判断:仅当本次回调由checkBoxer触发、且checkBoxer处于勾选状态时调用方法 if(buttonView == checkBoxer && isChecked){ afterscan(); } } }
如果没有用View Binding,也可以通过ID判断:buttonView.getId() == R.id.checkBoxer。
方案2:给checkBoxer单独设置监听器
如果checkBoxer的逻辑和其他CheckBox完全无关,也可以拆分监听器避免耦合:
- 现有
Chk_class监听器仅绑定给除checkBoxer之外的CheckBox - 给
checkBoxer单独设置专属OnCheckedChangeListener,仅在这个专属监听器里调用afterscan()
内容的提问来源于stack exchange,提问作者tomtom
相关产品推荐
相关产品推荐

