安卓复选框组

13

我想对一组复选框应用某种验证(例如,两个矛盾的项目不能同时被选中),因此我想将复选框对象分组,并在整个组上应用类似于RequiredFieldValidator的内容。 在该验证程序中,我将注册侦听器并对我的复选框对象进行整个检查。

我想象中的代码如下所示:

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

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

在Android中是否已经实现了这个功能? 如果没有,有人试过类似的东西吗?(希望在这里与我们分享)

8个回答

6

这个逻辑将允许选择一个或多个复选框

 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);
        }

    }
});

4
你可以使用单选按钮并设置不同的组。如果你决定使用单选按钮,这份文档这个教程应该会对你有所帮助。请注意保留HTML标记。

谢谢你的回答,我知道单选按钮是一个解决方法,但我想要的是将验证过程与开发过程分离,这样无论用户在活动中写什么,我的验证类都应该能够处理它,希望你明白我的意思。 - Mohamed Sobhy
据我所知,单选按钮不支持多选。 - aclowkay

3

另一个提示。

这种方式可以简单地注册监听器。

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);
    }

}

最好是动态的 :D - Maveňツ

3

以下是我的操作步骤,不确定是否适用于您,但这可能是一个好的起点。对于我的复选框,我不需要任何“on check”监听器,但如果您愿意,可以为每个添加一个。

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;
    }
    }
}

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;
    }

}

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;
        }
    }

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);

            }
        }
    });

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);
                }
            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接