Rares Biris
Rares Biris

Reputation: 195

disable checkboxes after certain number of checkboxes are checked

I have 6 checkboxes and I would want for example if I have a variable a=2 to let the user check 2 checkboxes and make the other disabled..if I have a=3 to let the user check 3 checkboxes and disable the rest and so on..This is what I tried:

 public void itemClicked(View v) {
            //code to check if this checkbox is checked!

         CheckBox checkBox = (CheckBox)v;

         check1=(CheckBox)findViewById(R.id.check1);
         check2=(CheckBox)findViewById(R.id.check2);
         check3=(CheckBox)findViewById(R.id.check3);
         check4=(CheckBox)findViewById(R.id.check4);
         check5=(CheckBox)findViewById(R.id.check5);
         check6=(CheckBox)findViewById(R.id.check6);



         if(a==1)

         {

           only one can be checked the others get disabled

            }




         }

     }

and a part of the xml file is:

<CheckBox android:id="@+id/check1"
        android:layout_width="140dp"
        android:layout_height="250dp"
         android:scaleX="1.0"
    android:scaleY="1.0"
    android:button="@layout/cb_selector"
         android:layout_marginLeft="80dp" 
        android:layout_marginTop="505dp" 
        android:onClick="itemClicked"
        />



        <CheckBox android:id="@+id/check2"
    android:layout_width="140dp"
        android:layout_height="250dp"
         android:scaleX="1.0"
    android:scaleY="1.0"
    android:button="@layout/cb_selector"
    android:layout_marginLeft="365dp" 
        android:layout_marginTop="505dp" 
        />

How can I achive this?

Upvotes: 0

Views: 1067

Answers (2)

Beloo
Beloo

Reputation: 9925

You need an array of checkboxes and a your check of variable in onCheckedChange.

CheckBox[] cba;      

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    cba = new CheckBox[]{
            (CheckBox)findViewById(R.id.check1),
            (CheckBox)findViewById(R.id.check2),
            (CheckBox)findViewById(R.id.check3),
            (CheckBox)findViewById(R.id.check4),
            (CheckBox)findViewById(R.id.check5),
            (CheckBox)findViewById(R.id.check6)
    };
    //here set onChechedChange for all your checkboxes
    for (CheckBox cb:cba) {
        cb.setOnCheckedChangeListener(cbListener);
    }

 }

CompoundButton.OnCheckedChangeListener cbListener = new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        checkEnoughAndMakeDisabled(cba);
    }
};

private void checkEnoughAndMakeDisabled(CheckBox checkBoxes[]){
    int countChecked =0;
    for (CheckBox cb:checkBoxes){
        cb.setEnabled(true);
        if (cb.isChecked()) countChecked++;
    }
    //your variable
    if (a <= countChecked) {
        for (CheckBox cb:checkBoxes){
            if (!cb.isChecked())cb.setEnabled(false);
        }
    }
}

Ps: Also i think the best practice for such issues is usage of Data-Binding, but it is other story

Upvotes: 2

Neria Nachum
Neria Nachum

Reputation: 1529

If there's a case where the user can select only one option, you better use radio buttons.

Anyway, here's a good and simple answer: https://stackoverflow.com/a/20041237/5280641.

Upvotes: 1

Related Questions