Установка слушателей программно для массива CheckBoxes - PullRequest
0 голосов
/ 10 октября 2019

До сих пор я сталкивался с проблемой "доступ к переменной x во внутреннем классе, должен быть объявлен как final. Я могу инициализировать CheckBox'ы, но не могу установить их слушатель после инициализации в цикле. Ниже приведен мой код.

for(int i=0;i<checkBox_fiber_ID.length;i++){
            int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
            checkBoxes_fiber[i]=findViewById(temp);
            checkBoxes_fiber[i].setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    if(checkBoxes_fiber[i].isChecked()){
                        //do something
                    }
                }
            });
        }

Любые советы, как решить эту проблему?

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Полагаю, вы пытаетесь сделать что-то, основываясь на идентификаторах флажков. Вы можете установить tag для checkBox и получить обратно tag в будущем. Кроме того, объект view в методе void onClick(View view) теперь является CheckBox. Просто измените немного в своем коде:

for(int i=0;i<checkBox_fiber_ID.length;i++){
            int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
            checkBoxes_fiber[i]=findViewById(temp);
            checkBoxes_fiber[i].setTag(i); //mark the check box id for later usage
            checkBoxes_fiber[i].setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View view) {
                    if(((CheckBox)view).isChecked()){
                        int checkBoxId = (int)view.getTag();
                        doSomething(checkBoxId);
                    }
                }
            });
        }
}

И напишите новый метод для бизнес-кода:

public void doSomething(int no){
    if(no==1){
       //do something
    }
    else if(no==2){
       //do something
    }
    //...
}
1 голос
/ 10 октября 2019

Взять final String [] x = {"defaultvalue Emptry"}

Затем, после прослушивания onclick, установите значение x, используя приведенный ниже код.

x [0] = "новое значение"

и используйте это значение в другой функции.

согласно вашему коду это выглядит как удар:

final String x[] ={""}
for(int i=0;i<checkBox_fiber_ID.length;i++){
        int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
        checkBoxes_fiber[i]=findViewById(temp);
        checkBoxes_fiber[i].setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                if(checkBoxes_fiber[i].isChecked()){
                   x[0]=checkBoxes_fiber[i].getvalue==> value name
                }
            }
        });
    }

Внешняя функция getзначение х с использованием

String name=x[0]
0 голосов
/ 10 октября 2019

Вы можете попытаться создать отдельный класс слушателя

 private View.OnClickListener mCheckboxListener = new View.OnClickListener() {
        public void onClick(View v) {
        if(((CheckBox)view).isChecked())
        {
        int checkBoxId = (int)v.getTag();  //You can get Id for specific checkbox
        //do other stuff with checkBoxId
       }
   }
};

И установить Id для каждого флажка, например

for(int i=0;i<checkBox_fiber_ID.length;i++){
            int temp=getResources().getIdentifier(checkBox_fiber_ID[i],"id",getPackageName());
            checkBoxes_fiber[i]=findViewById(temp);
            checkBoxes.setTag(i); //set check box id as tag for later usage
            checkBoxes_fiber[i].setOnClickListener(mCheckboxListener);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...