Android复选框组

时间:2012-04-12 10:44:08

标签: java android checkbox groupbox

我正在尝试对一组复选框应用某种验证(例如,两个相互矛盾的项目无法一起检查)所以我想以某种方式对Check Box对象进行分组并在整个组中应用类似于RequiredFieldValidator的内容该验证器我将注册监听器并对我的Check Boxes对象进行全面检查。

我想象的是一个看起来像这样的代码:

CheckBoxView allMyCheckBoxes = new CheckBoxView(checkbox1,checkbox2,checkbox3); //varargs
validate(allMyCheckBoxes);

验证将包含矛盾的复选框和所有内容的逻辑。

这已经在Android的某个地方实现了吗? 如果没有,有人试过这样的东西吗? (希望在这里与我们分享)

8 个答案:

答案 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 documentationThis 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;
        }
    }