【发布时间】:2017-05-09 17:17:38
【问题描述】:
我的登录复选框有问题
首先,我将制作 3 个复选框并为每个复选框创建更改侦听器
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
private CheckBox main_id_saver;
private CheckBox main_pw_saver;
private CheckBox main_auto_login;
在onCreate中也为每个wiget分配ID(xml文件被跳过)
main_id_saver = (CheckBox) findViewById(R.id.main_id_saver);
main_pw_saver = (CheckBox) findViewById(R.id.main_pw_saver);
main_auto_login = (CheckBox) findViewById(R.id.main_auto_login);
main_id_saver.setOnCheckedChangeListener(this);
main_pw_saver.setOnCheckedChangeListener(this);
main_auto_login.setOnCheckedChangeListener(this);
我想为满足以下条件的复选框设置点击事件
如果选中了 ID、PW 复选框,则自动选中自动登录复选框
不能只勾选 PW 复选框
如果勾选自动登录,则自动勾选ID、PW
如果在所有复选框都选中的状态下单击任何复选框,则所有复选框都未选中
我做了一些尝试,下面是那个
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (main_auto_login.isChecked()){
if(!main_id_saver.isChecked() || !main_pw_saver.isChecked()) {
main_id_saver.setChecked(true);
main_pw_saver.setChecked(true);
return;
} else if (main_id_saver.isChecked()&&main_pw_saver.isChecked()&&main_auto_login.isChecked()){
main_auto_login.setChecked(false);
main_id_saver.setChecked(false);
main_pw_saver.setChecked(false);
return;
}
} else if(main_pw_saver.isChecked()){
if(main_id_saver.isChecked()){
main_auto_login.setChecked(true);
return;
} else if(!main_id_saver.isChecked()){
Toast.makeText(MainActivity.this, "CANNOT REMEMBER PASSWORD BUT FOR ID",Toast.LENGTH_SHORT).show();
main_pw_saver.setChecked(false);
return;
}
}
return;
}
但它并没有像我想象的那样工作
解决这个问题的最佳代码是什么?
在我看来,单独制作 onChangedLinster 事件是最好的答案,但我做不到......
【问题讨论】:
-
剩余2个复选框的
onCheckedChanged在哪里 -
尝试设置一个像
dontFire = false;这样的实例字段,然后在事件if(dontFire) return; dontFire = true; . . dontFire = false;当你调用setChecked时再次调用事件,我猜这会搞砸。 -
@Redman onCheckedChanged 是否适用于所有复选框更改?
-
@alfoks 设置布尔类型变量是解决这个问题的唯一方法吗?好的,谢谢楼主
-
@timedeveloper 这就是我处理在事件本身内部调用
setChecked的方式。请参阅 Ekrem 的答案以简化您的代码,但您仍然需要停止再次调用该事件。