Android:如何取消选中复选框而不点击它?

时间:2015-11-03 07:02:10

标签: android checkbox

我的布局中有3个复选框:

  • (案例#1)mCheckBoxAll:当选中或取消选中时,所有其他框都设置为相同的状态。
  • (案例#2)mCheckBoxChoice1和mCheckBoxChoice2:如果用户未选中其中一个,则必须取消选中mCheckBoxAll。

    mCheckBoxAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    mCheckBoxChoice1.setChecked(isChecked);
                    mCheckBoxChoice2.setChecked(isChecked);
                }
            });
    
    mCheckBoxChoice1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (!isChecked)
                         mCheckBoxAll.setChecked(!isChecked);
                }
            });
    
    mCheckBoxChoice2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (!isChecked)
                         mCheckBoxAll.setChecked(!isChecked);
                }
            });
    

但是这个代码在#2的情况下不起作用。所有案件都在同一时间内未经检查......

4 个答案:

答案 0 :(得分:2)

我会在RadioGroup中放置所有应立即更改的复选框,并在检查mCheckBoxAll时迭代RadioGroup并选择/取消全部

  • 案例1

    final RadioGroup radioGroup = (RadioGroup)findViewById(R.id.radioGroup);
    
    for (int i = 0; i < radioGroup.getChildCount(); i++){
        ((RadioButton) radioGroup.getChildAt(i)).setChecked(isChecked);
    }
    
  • 案例2 - 您可以调用此方法,以确定是否取消选中其中一个按钮(在onCheckedChanged上的2个按钮内调用)。如果返回false,则取消选择主RadioButton

    private boolean isButtonUnchecked() {
    
        for (int i = 0; i < radioGroup.getChildCount(); i++){
            RadioButton radioButton = (RadioButton) radioGroup.getChildAt(i);
            if (!radioButton.isChecked()) {
                return false;
            }
        }
    
        return true;
    }
    

答案 1 :(得分:0)

如果取消选中checkbox2,那么您将取消选中checkboxall的状态,并调用checkbox1以取消选中,这是您的问题。

因此,如果选中复选框1和2,然后取消选中复选框2,则会影响复选框1。

编辑: 如果它来自两个复选框之一,或者来自取消选中all,则应该在checkboxall中标识未选中的源。 最简单的解决方案是在您的activity / fragment中声明一个全局变量,它告诉您是否来自复选框1和2。 如果您的checkboxall侦听器仅在值为true时取消选中1和2。 当你做错时,别忘了改变它的价值。

答案 2 :(得分:0)

编辑代码: 将代码修改为

bundle install

答案 3 :(得分:0)

使用下面的代码,它将适用于你的场景

 int   mCheckBoxAll_clicktimes=0;
    int  mCheckBoxChoice2_clicktimes=0;
    int mCheckBoxChoice1_clicktimes=0;

    mCheckBoxAll.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {

                                mCheckBoxChoice1.setChecked(false);
                                mCheckBoxAll.setChecked(false);
                                mCheckBoxChoice2.setChecked(false);

                                mCheckBoxAll_clicktimes++;
                                mCheckBoxChoice2_clicktimes=0;
                                mCheckBoxChoice1_clicktimes=0;
                                if(mCheckBoxAll_clicktimes%2 !=0 || mCheckBoxAll_clicktimes==0){
//-----when mcheckbox all checked

                                    mCheckBoxAll.setChecked(true);
                                     mCheckBoxChoice1.setChecked(true);
                                 mCheckBoxChoice2.setChecked(true);                          

                                }else{
                                //===when mcheckboxall unchecked
                                          mCheckBoxChoice1.setChecked(false);
                                mCheckBoxAll.setChecked(false);
                                mCheckBoxChoice2.setChecked(false);
                                }
                            }
                        });

                        mCheckBoxChoice1.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {

                                mCheckBoxChoice1.setChecked(false);
                                mCheckBoxAll.setChecked(false);
                                mCheckBoxChoice2.setChecked(false);

                                mCheckBoxAll_clicktimes=0;
                                mCheckBoxChoice2_clicktimes=0;
                                mCheckBoxChoice1_clicktimes++;
                                if(mCheckBoxChoice1_clicktimes%2 !=0 || mCheckBoxChoice1_clicktimes==0){
                                //when mCheckBoxChoice1 checked
                                     mCheckBoxChoice1.setChecked(true);

                                }else{
                                //====when mCheckBoxChoice1 unchecked
                                          mCheckBoxChoice1.setChecked(false);
                                mCheckBoxAll.setChecked(false);
                                 }
                            }
                        });

                        mCheckBoxChoice2.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {

                                mCheckBoxChoice1.setChecked(false);
                                mCheckBoxAll.setChecked(false);
                                mCheckBoxChoice2.setChecked(false);

                                mCheckBoxAll_clicktimes=0;
                                mCheckBoxChoice2_clicktimes++;
                                mCheckBoxChoice1_clicktimes=0;
                                if(mCheckBoxChoice2_clicktimes%2 !=0 || mCheckBoxChoice2_clicktimes==0){
                                //when mCheckBoxChoice2 checked
                                     mCheckBoxChoice2.setChecked(true);

                                }else{
                                //when mCheckBoxChoice2 unchecked
                                          mCheckBoxChoice2.setChecked(false);
                                mCheckBoxAll.setChecked(false);
                                 }
                            }
                        });