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