Как отключить флажок при достижении предела в Android?

У меня есть 15 CheckBox, и я должен заблокировать пользователя, когда он проверяет более 5. Я использую метод OnCheckedChangeListener, чтобы узнать, отмечен ли элемент, но я не знаю, как ограничить после 5 выбранных элементов .

Смотрите мой код ниже:

int lengthBox = 15;
int lenghtCount = 0;  

// inside onCreate method
final CheckBox[] checkbox = new CheckBox[lengthBox];
OnCheckedChangeListener checker = new OnCheckedChangeListener(){ 
    @Override
    public void onCheckedChanged(CompoundButton cb, boolean b) {
        // How can I improve this condition?
        if(checkbox[0].isChecked() || checkbox[1].isChecked() || 
        checkbox[2].isChecked() || checkbox[3].isChecked() || 
        checkbox[4].isChecked() || checkbox[5].isChecked() || 
        checkbox[6].isChecked() || checkbox[7].isChecked() || 
        checkbox[8].isChecked() || checkbox[9].isChecked() || 
        checkbox[10].isChecked() || checkbox[11].isChecked() || 
        checkbox[12].isChecked() || checkbox[13].isChecked() || 
        checkbox[14].isChecked()) {  
            if(lenghtCount < 5){
                lenghtCount++;
            }else{
                Toast.makeText(MyActivity.this, "Limit reached!!!", Toast.LENGTH_SHORT).show();
            }
        }
    }
};
for(int i = 0; i < lengthBox; i++) {
    int id = getResources().getIdentifier("checkbox_"+i, "id", getPackageName());
    checkbox[i] = (CheckBox) findViewById(id)
    checkbox[i].setOnCheckedChangeListener(checker);
}

Может кто-нибудь указать мне правильный путь, пожалуйста?


ОБНОВЛЕНИЕ: я пробовал:

OnCheckedChangeListener checker = new OnCheckedChangeListener(){ 
    @Override
    public void onCheckedChanged(CompoundButton cb, boolean b) {
        if(lenghtCount == 5){
            cb.setChecked(false);
        }else if(b){
            lenghtCount++;
        }else if(!b){
            lenghtCount--;
        }
    }
};  

Работает отлично, но я думаю, что чего-то не хватает. Когда я нажимаю 5 элементов, это работает, но после того, как я отменяю их выбор, я не могу перепроверить ни один элемент. Что мне не хватает?


person fllo    schedule 18.11.2013    source источник


Ответы (4)


вы должны использовать другую переменную для подсчета количества отмеченных флажков

final int count=0; 
OnCheckedChangeListener checker = new OnCheckedChangeListener(){ 
        @Override
        public void onCheckedChanged(CompoundButton cb, boolean b) {
           if(count == maxLimit && b){
               cb.setChecked(false);
               Toast.makeText(getApplicationContext(), 
            "Limit reached!!!", Toast.LENGTH_SHORT).show();
           }else if(b){

                count++;
                CharSequence myCheck = tagsCheck[i].getText();
                Toast.makeText(getApplicationContext(), 
                       myCheck + " checked!", 
                       Toast.LENGTH_SHORT)
                .show();
            }else if(!b){
 count--;
        }
    }; 
person zohreh    schedule 18.11.2013
comment
Работает как шарм! Большое спасибо - person fllo; 18.11.2013
comment
ты гений @zohreh. Вы спасли мой день. Большое спасибо - person Saurabh Bhandari; 23.12.2016
comment
Вы сделали мой день - person Vlusion; 13.11.2020

Я не уверен, но что-то вроде этого может вам помочь. создайте глобальную переменную счетчика, и каждый раз, когда флажок установлен, увеличивайте счетчик на 1, и как только счетчик достигнет максимума, отключите дальнейшие проверки. Сделайте что-то вроде этого:

      OnCheckedChangeListener checker = new OnCheckedChangeListener(){ 
        @Override
        public void onCheckedChanged(CompoundButton cb, boolean b) {
           if(checkedCount == maxLimit){
               // set to unchecked and return. there must be some method for that 
               // like : setChecked(0) or some other method.
               return;
           }
           if(.isChecked()){

                checkedCount++;
                CharSequence myCheck = tagsCheck[i].getText();
                Toast.makeText(getApplicationContext(), 
                       myCheck + " checked!", 
                       Toast.LENGTH_SHORT)
                .show();
            }
        }
    };    
person Sayed Jalil Hassan    schedule 18.11.2013

Попробуйте это.. Создайте int check = 0; как глобальный

OnCheckedChangeListener checker = new OnCheckedChangeListener(){ 
    @Override
    public void onCheckedChanged(CompoundButton cb, boolean b) {
   if(isChecked)
    {
        check ++;
        Toast.makeText(getApplicationContext(), 
                   myCheck + " checked! " +buttonView.getText(), 
                   Toast.LENGTH_SHORT)
            .show();            
    }
    else
    {
        check --;
        Toast.makeText(getApplicationContext(), 
                   myCheck + "Un checked! " +buttonView.getText(), 
                   Toast.LENGTH_SHORT)
            .show();    

    }


    if(check >= 5)
    {
        Toast.makeText(getApplicationContext(), 
                   myCheck + "Checked 5", 
                   Toast.LENGTH_SHORT)
            .show();
    }   
    }
};  
person Hariharan    schedule 18.11.2013

Предположим, вам нужно выбрать максимум 2 флажка из 4, тогда будет полезен следующий код:

    Checkbox[] CBA = new CheckBox[4];
    int Count=0;
    CBA[0]=findViewByID(R.id.C1);
    CBA[1]=findViewByID(R.id.C2);
    CBA[2]=findViewByID(R.id.C3);
    CBA[3]=findViewByID(R.id.C4);
    CBA[0].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    for(int i=0;i<CBA.length;i++)
        if(CBA[i].isChecked)
        {
         Count++;
        } 
    if(Count>2)
    {
     CBA[0].setCheck(false);
    }                       
    }

);

Сделайте то же самое для другого флажка 3. Вы также можете сделать это, используя прослушиватель Checkchanged для всего массива (CBA[i].setOnCheckedChangeListener)............. Надеюсь, это будет полезно

person Nishant    schedule 11.10.2018
comment
Я попробовал это решение. Но тогда предел достигнут, и я хочу установить другой флажок, он не позволит мне это сделать. - person Vlusion; 08.11.2020