Android 复选框组

Posted

技术标签:

【中文标题】Android 复选框组【英文标题】:Android Check box Group 【发布时间】:2012-04-24 16:56:33 【问题描述】:

我正在尝试对一组复选框应用某种验证(例如,不能同时选中两个相互矛盾的项目),所以我想以某种方式对 Check Box 对象进行分组,并在整个组上一次应用RequiredFieldValidator 之类的东西该验证器我将注册侦听器并对我的 Check Boxes 对象进行全面检查。

我想象的代码会是这样的:

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

Validate 将包含相互矛盾的复选框和所有内容的逻辑。

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

【问题讨论】:

【参考方案1】:

您可以使用单选按钮并设置它们的不同组。

This documentation 和 This tutorial 应该可以帮助您,如果您发现单选按钮是可行的方法。

【讨论】:

感谢您的回答,但虽然我知道单选按钮是一种解决方法,但我正在考虑的想法是将验证与开发过程分开,所以无论有人在活动中写下我的验证类应该可以毫无问题地处理它。希望你明白我的意思。 据我所知单选按钮不支持多选【参考方案2】:

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

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

    
);

【讨论】:

【参考方案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;
    
    

【讨论】:

【参考方案4】:

对类似于单选按钮的复选框进行验证的最佳方法

 // 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】:

另一个提示。

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

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【参考方案6】:

这是允许从两个中选择一个复选框的逻辑,如果您想从多个中选择一个然后更改它。

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

            
        
    );

【讨论】:

【参考方案7】:
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);
                
            
        );

【讨论】:

【参考方案8】:

使用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;
        
    

【讨论】:

以上是关于Android 复选框组的主要内容,如果未能解决你的问题,请参考以下文章

android数据绑定:如何避免以编程方式触发的onCheckedChanged

react native - 如何在元组数组中使用 React Hooks?

如何使引导复选框组在选中时关闭另一个组中的所有复选框

Extjs-3.4 复选框组指定列中的复选框

确保为多组复选框选中至少一个复选框?

如何使用 Vuetify 验证复选框组