我正在尝试对一组复选框应用某种验证(例如,两个相互矛盾的项目无法一起检查)所以我想以某种方式对Check Box对象进行分组并在整个组中应用类似于RequiredFieldValidator的内容该验证器我将注册监听器并对我的Check Boxes对象进行全面检查。
我想象的是一个看起来像这样的代码:
CheckBoxView allMyCheckBoxes = new CheckBoxView(checkbox1,checkbox2,checkbox3); //varargs
validate(allMyCheckBoxes);
验证将包含矛盾的复选框和所有内容的逻辑。
这已经在Android的某个地方实现了吗? 如果没有,有人试过这样的东西吗? (希望在这里与我们分享)
答案 0 :(得分:4)
此逻辑将允许选择一个或多个复选框
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);
}
}
});
答案 1 :(得分:3)
这就是我所做的。不确定这是否适合你,但它可以作为一个开始使用的东西。 我的复选框我不需要任何检查听众,但如果你愿意,你可以将它们添加到每一个
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;
}
}
}
答案 2 :(得分:2)
您可以使用单选按钮并设置不同的组。
This documentation和This tutorial应该会帮助您,如果您发现无线电按钮是可行的方法。
答案 3 :(得分:1)
另一个提示。
这种方式可以简单地注册听众。
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);
}
}
答案 4 :(得分:0)
对类似于无线电按钮的复选框进行验证的最佳方法
// 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;
}
}
答案 5 :(得分:0)
这是允许从两个中选中一个复选框的逻辑,如果您想从多个中选择一个,然后进行更改。
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);
}
}
});
答案 6 :(得分:0)
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);
}
}
});
答案 7 :(得分:0)
使用 ButterKnife
库:
@BindViews({R.id.checkbox_1, R.id.checkbox_2, R.id.checkbox_3, R.id.checkbox_4})
List<CheckBox> checkBoxes;
private void setChecked(int id){
for(int i = 0; i < checkBoxes.size(); i++){
if(checkBoxes.get(i).getId() != id){
checkBoxes.get(i).setChecked(false);
}else{
checkBoxes.get(i).setChecked(true);
}
}
}
@OnClick({R.id.checkbox_1, R.id.checkbox_2, R.id.checkbox_3, R.id.checkbox_4})
void onCheckBoxClick(View view){
switch (view.getId()){
case R.id.checkbox_1:
uncheckOthers(view.getId());
break;
case R.id.checkbox_2:
uncheckOthers(view.getId());
break;
case R.id.checkbox_3:
uncheckOthers(view.getId());
break;
case R.id.checkbox_4:
uncheckOthers(view.getId());
break;
}
}