2015-11-11 2 views
-2

Я создал программно, 5 радиогрупп с 4 переключателями каждый. Я установил OnClickListener на кнопку сброса, которую я создал тоже. Я хочу, чтобы кто-то нажал кнопку, чтобы перезапустить мою активность. Как это возможно? Когда приложение запускается в первый раз, оно работает нормально, но когда я нажимаю кнопку для перезагрузки активности, эмулятор падает. Если я прокомментирую строки, где я создаю группы радио и радиокнопки, и я нажимаю кнопку, действие перезаряжается в порядке, в противном случае у меня есть эта ошибка: Unable to start activity ComponentInfo{...}: java.lang.ArrayIndexOutOfBoundsException: length=4; index=4. Как можно перезагрузить работу без проблем? Вот мой код:Как исправить ArrayIndexOutOfBoundsException при перезагрузке в Android?

answerGroup = new RadioGroup[5]; 
    answer = new RadioButton[4]; 
    int i = 0; 
    for (Question qn : questions) { 
     answerGroup[i] = new RadioGroup(this); 
     answerGroup[i].setOrientation(RadioGroup.VERTICAL); 
     int j = 0; 
     for (Answer an : answers) { 
      if (qn.getID() == an.getQuestion_id_answer()) { 
       answer[j] = new RadioButton(this); 
       answer[j].setText(an.getAnswer()); 
       answerGroup[i].addView(answer[j]); 
       j++; 
      } 
     } 
     linearLayout.addView(answerGroup[i]); 
     i++; 
    } 

    restartButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = getIntent(); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      finish(); 
      startActivity(intent); 
     } 
    }); 

Спасибо!

+0

укажите, пожалуйста, все logcat –

+0

, что он показывает в logcat –

+0

Да, вы правы. Вот мой [весь logcat] (http://www.gogo.ro/23.png) –

ответ

0

Активность, вероятно, пытается ссылаться на элементы старого вида (начиная с момента перезапуска Activity). Попробуйте добавлять компоненты просмотра:

  • RadioGroup
  • RadioButton

В переменных класса. Можете ли вы попробовать это и сказать мне, что он делает? Я обновлю этот ответ в соответствии с введенным вами вкладом.

EDIT:

Я предполагаю, что вы используете ArrayList<Question> и ArrayList<Answer> в качестве переменной questions и answers.

 for (Question qn : questions) { 
      RadioGroup answerGroup = new RadioGroup(this); 
      answerGroup.setOrientation(RadioGroup.VERTICAL); 
      for (Answer an : qn.getAnswers()) { 
       if (qn.getID() == an.getQuestion_id_answer()) { 
        RadioButton answer = new RadioButton(this); 
        answer.setText(an.getAnswer()); 
        answerGroup.addView(answer); 
       } 
      } 
      linearLayout.addView(answerGroup); 
     } 

Может быть, вы должны добавить метод геттер на ваш вопрос называется: getAnswers(); и переменной к вашей Question модели под названием List<Answer> answers. Конечно, эти ответы должны быть установлены до того, как вы попытаетесь что-либо сделать с ними.

+0

Хорошо, я попробую, но как добавить компоненты просмотра? Можете быть более конкретными? –

+0

Невозможно создать эти представления в файлах макетов? Если вы перезапустите действие, жизненный цикл элементов вашего представления обрабатывается платформой Android. Есть еще одна возможность: откуда берется ваша переменная 'questions'? Он очищается от перезапуска активности? –

+0

Можете ли вы попробовать подход, который я описал в своем редактировании? –

0

Вы должны отладить код, возможно не все ваши вопросы имеют 4 ответа.

Если один из ваших вопросов больше 4 ответов (например: 5), и вы пытаетесь цикла через них вы получите ArrayIndexOutOfBoundsException потому что j>=4.


В качестве решения: попробуйте использовать List для RadioButtons:

List<RadioButton> answer = new ArrayList<RadioButton>(); 

И для каждой итерации добавить новый RadioButton:

answer.add(new RadioGroup(this)); 

PS: Также я предложите использовать метод recreate() для перезагрузки/воссоздания ctivity.

+0

Все мои вопросы имеют, конечно, 4 ответа. Я извлекаю эти вопросы и ответы из базы данных. Если на вопрос было более 4 ответов, наверняка у меня была эта проблема в первую очередь. Я попытался сделать это, и эмулятор разбился при старте. Это правда, потому что для простоты этого примера всего 5 вопросов с 4 ответами, но в одно мгновение вместо 5 вопросов будет не менее 25, но количество ответов останется таким же, 4. Можете ли вы написать мне? некоторые строки в соответствии с моим примером? Я тебя совсем не понимаю. Метод 'recreate()' я также использую в 'onClick'? Ty –

Смежные вопросы