Android开发:多CheckBox勾选取消后Button背景色无法正确恢复问题
问题根因
- 你当前的
else分支仅和第二个if (cb2.isChecked())条件绑定,逻辑覆盖存在漏洞:只要cb2未被勾选,无论cb1的状态是什么,else都会直接将所有按钮重置为绿色,和你需要的「仅cb1勾选时1-3按钮为灰色」的需求冲突 - 没有提前统一初始化按钮的默认状态,导致之前的勾选状态残留,取消勾选时无法正常回退
- 另外你现有代码里的
findViewById前多写了冗余的左括号,还需要给两个CheckBox都绑定OnCheckedChangeListener才能正常触发回调
修复方案
每次触发勾选回调时,先将所有按钮默认设为绿色,再根据当前两个CheckBox的勾选状态,按需将对应按钮改为灰色即可,逻辑清晰不易出错。
修复后完整代码
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener{ CheckBox cb1, cb2; Button b1, b2, b3, b4, b5; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 修正findViewById的多余左括号问题 cb1 = findViewById(R.id.cb1); cb2 = findViewById(R.id.cb2); b1 = findViewById(R.id.b1); b2 = findViewById(R.id.b2); b3 = findViewById(R.id.b3); b4 = findViewById(R.id.b4); b5 = findViewById(R.id.b5); // 给两个CheckBox都绑定监听,否则只有一个会触发回调 cb1.setOnCheckedChangeListener(this); cb2.setOnCheckedChangeListener(this); } @Override public void onCheckedChanged (CompoundButton buttonView,boolean isChecked) { // 第一步:先把所有按钮默认设为绿色 b1.setBackgroundColor(ContextCompat.getColor(this, R.color.green)); b2.setBackgroundColor(ContextCompat.getColor(this, R.color.green)); b3.setBackgroundColor(ContextCompat.getColor(this, R.color.green)); b4.setBackgroundColor(ContextCompat.getColor(this, R.color.green)); b5.setBackgroundColor(ContextCompat.getColor(this, R.color.green)); // 第二步:根据勾选状态设置需要变灰的按钮 if (cb1.isChecked()) { b1.setBackgroundColor(ContextCompat.getColor(this, R.color.grey)); b2.setBackgroundColor(ContextCompat.getColor(this, R.color.grey)); b3.setBackgroundColor(ContextCompat.getColor(this, R.color.grey)); } if (cb2.isChecked()) { b3.setBackgroundColor(ContextCompat.getColor(this, R.color.grey)); b4.setBackgroundColor(ContextCompat.getColor(this, R.color.grey)); b5.setBackgroundColor(ContextCompat.getColor(this, R.color.grey)); } } }
内容的提问来源于stack exchange,提问作者Jaykos
相关产品推荐
相关产品推荐

