Как заставить цикл for ждать завершения обработчика события?Android - PullRequest
0 голосов
/ 18 сентября 2019

У меня есть цикл, который повторяется 10 раз.Каждый раз я обновляю вопрос и варианты и проверяю правильность выбора.Дело в том, что цикл не ждет, пока setOnClickListner завершит свою работу!он просто игнорирует его и повторяет до конца.Кроме того, если я помещаю counter в слушателя, он просто заходит в бесконечный цикл, и экран становится темным.Как мне преодолеть это?

Примечание: counter было объявлено глобально.

 for(;counter<10;counter++){
        questionTv.setText(questions[counter]);
        questionImage.setImageResource(images[counter]);
        choice1.setText(choices[counter][0]);
        choice2.setText(choices[counter][1]);
        choice3.setText(choices[counter][2]);
        choice4.setText(choices[counter][3]);
        choice1.setEnabled(true);
        choice2.setEnabled(true);
        choice3.setEnabled(true);
        choice4.setEnabled(true);
        choicesRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(RadioGroup group,int checkedId){
                switch(checkedId){
                    case R.id.choice1:{
                        checkAnswer(answers,choice1,choice2,choice3,choice4,scoreTv); //a method to check the answer and do necessary modification. 
                        break;
                    }
                    case R.id.choice2:{
                        checkAnswer(answers,choice2,choice1,choice3,choice4,scoreTv);
                        break;
                    }
                    case R.id.choice3:{
                        checkAnswer(answers,choice3,choice2,choice1,choice4,scoreTv);
                        break;
                    }
                    case R.id.choice4:{
                        checkAnswer(answers,choice4,choice2,choice3,choice1,scoreTv);
                        break;
                    }
                }
            }
        });
    }

1 Ответ

1 голос
/ 19 сентября 2019

Быстро справился с этим, однако, как я уже сказал в своем комментарии, в дизайне есть более эффективные способы делать то, что вы делаете, без циклов, используя компоненты Android.

У вас есть список вопросов,и, как и ожидалось, количество вопросов увеличивается от 1 до 10 (в вашем случае), поэтому давайте увеличивать номер вопроса после каждого вызова checkAnswer, а затем обновим представление:

private void setQuestions(int questionNum) {
        questionTv.setText(questions[questionNum]);
        questionImage.setImageResource(images[questionNum]);
        choice1.setText(choices[questionNum][0]);
        choice2.setText(choices[questionNum][1]);
        choice3.setText(choices[questionNum][2]);
        choice4.setText(choices[questionNum][3]);
        choice1.setEnabled(true);
        choice2.setEnabled(true);
        choice3.setEnabled(true);
        choice4.setEnabled(true);
        choicesRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
            @Override
            public void onCheckedChanged(RadioGroup group,int checkedId){
                switch(checkedId){
                    case R.id.choice1:{
                        checkAnswer(answers,choice1,choice2,choice3,choice4,scoreTv, questionNum); //a method to check the answer and do necessary modification.
                        break;
                    }
                    case R.id.choice2:{
                        checkAnswer(answers,choice2,choice1,choice3,choice4,scoreTv, questionNum);
                        break;
                    }
                    case R.id.choice3:{
                        checkAnswer(answers,choice3,choice2,choice1,choice4,scoreTv, questionNum);
                        break;
                    }
                    case R.id.choice4:{
                        checkAnswer(answers,choice4,choice2,choice3,choice1,scoreTv, questionNum);
                        break;
                    }
                }
            }
        });
    }

private void checkAnswer(List<String> answers, 
                         boolean choice1, 
                         boolean choice2, 
                         boolean choice3, 
                         boolean choice4, 
                         TextView scoreTv,
                         int questionNum) {
    // Do stuff
    setQuestions(questionNum++);
}
...