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

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

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

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

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

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

【问题讨论】:

    标签: java android checkbox groupbox


    【解决方案1】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-11-01
                • 2014-05-29
                • 2011-06-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多