チェックボックスのグループにある種の検証を適用しようとしているので(たとえば、2つの矛盾する項目を一緒にチェックできない)、何らかの方法でチェックボックスオブジェクトをグループ化し、RequiredFieldValidatorのようなものをグループ全体に一度適用してそのバリデーターに適用したいと思います。リスナーを登録し、チェックボックスオブジェクトのチェック全体を実行します。
私が想像するのは、次のようなコードです。
CheckBoxView allMyCheckBoxes = new CheckBoxView(checkbox1,checkbox2,checkbox3); //varargs
validate(allMyCheckBoxes);
Validateには、矛盾するチェックボックスとすべてのロジックが含まれます。
それはすでにAndroidのどこかに実装されていますか?そうでなければ、誰かがそのようなことを試しましたか? (うまくいけば、ここで私たちと共有してください)
このロジックにより、1つ以上のチェックボックスを選択できます
private Checkbox day = (checkbox)findviewbyid(R.id.day);
private Checkbox night =(checkbox)findviewbyid(R.id.night);
day.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (!night.isChecked() && !day.isChecked()) {
night.setChecked(true);
}
}
});
night.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (!day.isChecked() && !night.isChecked()) {
day.setChecked(true);
}
}
});
これが私がしたことです。これがあなたのために働くかどうかはわかりませんが、それはあなたが出発点として使うことができるものです。私のチェックボックスはチェックリスナーには必要ありませんが、必要に応じてそれぞれに追加できます
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private CheckBox chk1, chk2, chk3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chk1 = (CheckBox) findViewById(R.id.checkbox1);
chk2 = (CheckBox) findViewById(R.id.checkbox2);
chk3 = (CheckBox) findViewById(R.id.checkbox3);
if (chk1.isChecked()) {
chk1.setChecked(false);
}
else if(chk2.isChecked()){
chk2.setChecked(false);
}
else {
chk3.setChecked(false);
}
chk1.setOnClickListener(this);
chk2.setOnClickListener(this);
chk3.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.checkbox1:
chk1.setChecked(true);
chk2.setChecked(false);
chk3.setChecked(false);
break;
case R.id.checkbox2:
chk2.setChecked(true);
chk3.setChecked(false);
chk1.setChecked(false);
break;
case R.id.checkbox3:
chk3.setChecked(true);
chk2.setChecked(false);
chk1.setChecked(false);
break;
}
}
}
別のヒント。
このようにして、リスナーを簡単に登録できます。
private CheckBox[] chkBoxs;
private Integer[] chkBoxIds = {R.id.a, R.id.b, R.id.c .....};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chkBoxs = new CheckBox[chkBoxIds.length];
for(int i = 0; i < chkBoxIds.length; i++) {
chkBoxs[i] = (CheckBox) findViewById(chkBoxIds[i]);
chkBoxs[i].setOnCheckedChangeListener(this);
}
}
binding.overPhone.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
binding.overPhone.setChecked(true);
binding.overMail.setChecked(false);
}else{
binding.overPhone.setChecked(false);
binding.overMail.setChecked(true);
}
}
});
binding.overMail.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
binding.overPhone.setChecked(false);
binding.overMail.setChecked(true);
}else{
binding.overPhone.setChecked(true);
binding.overMail.setChecked(false);
}
}
});
これは、2つから1つのチェックボックスを許可するロジックです。複数から1つを選択する場合は、それを変更します。
checkBoxHightoLow.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (checkBoxLowToHigh.isChecked()) {
checkBoxLowToHigh.setChecked(false);
checkBoxHightoLow.setChecked(isChecked);
} else if (!checkBoxLowToHigh.isChecked()) {
checkBoxHightoLow.setChecked(isChecked);
}
}
});
checkBoxLowToHigh.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (checkBoxHightoLow.isChecked()) {
checkBoxHightoLow.setChecked(false);
checkBoxLowToHigh.setChecked(isChecked);
} else if (!checkBoxHightoLow.isChecked()) {
checkBoxLowToHigh.setChecked(isChecked);
}
}
});
ラジオボタンと同様のチェックボックスで検証を行うための最良の方法
// Implements your activity
CompoundButton.OnCheckedChangeListener
// Declare global variables
private CheckBox cbDriver, cbPickDrop;
private String strCB;
// Bind components and set listeners in onCreate()
cbDriver = (CheckBox) findViewById(R.id.driverCB);
cbPickDrop = (CheckBox) findViewById(R.id.pickDropCB);
cbDriver.setOnCheckedChangeListener(this);
cbPickDrop.setOnCheckedChangeListener(this);
// write this method inside your activity
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()){
case R.id.driverCB:
if (isChecked) {
cbPickDrop.setChecked(false);
strCB = cbDriver.getText().toString();
DialogManager.showToast(MyActivity.this, strCB);
}
break;
case R.id.pickDropCB:
if (isChecked) {
cbDriver.setChecked(false);
strCB = cbPickDrop.getText().toString();
DialogManager.showToast(MyActivity.this, strCB);
}
break;
}
}