2013-03-08 1 views
0

Ну, у меня с этой проблемой около 3 дней. Я делаю викторину, но не могу определить, содержит ли нажатая кнопка правильный ответ или нет. Следуя советам, которые я видел здесь, я внес некоторые изменения в свой код. Смотрите новый код:Android: Невозможно определить правильный ответ в викторине

package com.app; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import java.util.Random; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class MyActivity extends Activity implements OnClickListener { 


    TextView textView1, textView2; 
    Button btn1, btn2, btn3, btn4; 

    ArrayList<Question> qsts = new ArrayList<Question>(); 
    List<Integer> generated = new ArrayList<Integer>(); 

    ArrayList<String> allAnswers = new ArrayList<String>(); 

    Random rng = new Random(); 
    Question nextQuestion; 


// Creating the objects Question that recieves the values "questionText", "correctAnswerText", and the other 3 wrong answers "wrongAnswer1" 2 and 3... 

    Question q1 = new Question(
      "Question 1", 

      "Correct Answer - Question 1", 
      "Wrong 1 - Question 1", 
      "Wrong 2 - Question 1", 
      "Wrong 3 - Question 1" 
      ); 
    Question q2 = new Question(
      "Question 2", 

      "Correct Answer - Question 2", 
      "Wrong 1 - Question 2", 
      "Wrong 2 - Question 2", 
      "Wrong 3 - Question 2" 
      ); 
    Question q3 = new Question(
      "Question 3", 

      "Correct Answer - Question 3", 
      "Wrong 1 - Question 3", 
      "Wrong 2 - Question 3", 
      "Wrong 3 - Question 3" 
      ); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_other); 


    // ADD THE QUESTIONS IN THE ArrayList qsts 

    qsts.add(q1);   
     qsts.add(q2); 
     qsts.add(q3); 

     textView1 = (TextView) findViewById(R.id.textView1); 
      textView2 = (TextView) findViewById(R.id.textView2); 

      btn1 = (Button) findViewById(R.id.btn1); 
      btn2 = (Button) findViewById(R.id.btn2); 
      btn3 = (Button) findViewById(R.id.btn3); 
      btn4 = (Button) findViewById(R.id.btn4); 

      btn1.setOnClickListener(this); 
      btn2.setOnClickListener(this); 
      btn3.setOnClickListener(this); 
      btn4.setOnClickListener(this); 

     generateQuestion(); 

    } 

     public void generateQuestion(){ 




      while(true){ 

       int nxt = rng.nextInt(3); 

       if (!generated.contains(nxt)){ 

        generated.add(nxt); 

        Question nextQuestion = qsts.get(nxt); 

        textView1.setText(nextQuestion.questionText); 

        allAnswers.add(nextQuestion.correctAnswerText); 
        allAnswers.add(nextQuestion.wrongAnswer1); 
        allAnswers.add(nextQuestion.wrongAnswer2); 
        allAnswers.add(nextQuestion.wrongAnswer3); 

        Collections.shuffle(allAnswers); 

        btn1.setText(allAnswers.get(0)); 
        btn2.setText(allAnswers.get(1)); 
        btn3.setText(allAnswers.get(2)); 
        btn4.setText(allAnswers.get(3)); 

        break; 
       } 
      } 
     } 

     @Override 
     public void onClick(View v) { 
      Button b = (Button)v; 
      String buttonText = b.getText().toString(); 

      if(buttonText.equals(nextQuestion.correctAnswerText)) 
      { 

       textView2.setText("CORRECT!"); 
       generateQuestion(); 
       return; 

      }else{ 
       textView2.setText("WRONG!"); 
       generateQuestion(); 
       return; 
      } 

     } 
} 

я создавал объекты в коде Вопрос класса и работал с static объектами, но следуя советам, я сделал именно так.

Вот код класса:

package com.app; 

public class Question { 

    String questionText; 
    String correctAnswerText;  
    String wrongAnswer1; 
    String wrongAnswer2; 
    String wrongAnswer3; 


    Question (String qst, String cAns, String wAns1, String wAns2, String wAns3){ 

     questionText = qst; 
     correctAnswerText = cAns; 
     wrongAnswer1 = wAns1; 
     wrongAnswer2 = wAns2; 
     wrongAnswer3 = wAns3; 

    } 

Я знаю, что проблема заключается в Comparation в if в методе OnClick, потому что, когда я сравниваю струнный ButtonText с чем-то другим, это работает. Пожалуйста, скажите мне, почему я не могу сравнить с nextQuestion.correctAnswerText. Я объявляю что-то не в том месте?

Наблюдение: приложение останавливается, когда я нажимаю одну из 4 кнопок, которые содержат ответ (правильный или неправильный)

+0

'Наблюдение: приложение останавливается' Что значит, приложение останавливается? Он падает? – Simon

+0

Это ваш точный код. –

+0

Да, @Simon. Он падает. Извините, это не мой первый язык – 2013-03-08 18:44:04

ответ

1

Смотрите ваши объявляют Question nextQuestion дважды. Один глобальный и другой в функции generateQuestion()

И глобальный nextQuestion имеет значение null, и это ваша ошибка.

Заменить это (Question nextQuestion = qsts.get(nxt);) строки в функции generateQuestion() с nextQuestion = qsts.get(nxt);

решения для вашего комментария. allAnswers.clear() сделать это перед тем генератор новый вопрос.

 if(buttonText.equals(nextQuestion.correctAnswerText)) 
     { 

      textView2.setText("CORRECT!"); 
      allAnswers.clear(); 
      generateQuestion(); 
      return; 

     }else{ 
      textView2.setText("WRONG!"); 
      allAnswers.clear(); 
      generateQuestion(); 
      return; 
     } 
+0

Global? Не на этом сайте ... – Simon

+0

@Simon это неправильно –

+0

http://c2.com/cgi/wiki?GlobalVariablesAreBad. Принципиальным принципом проектирования является то, что все переменные должны иметь самый короткий срок службы. Поле класса, вероятно, подходит в этом случае, но определенно не является глобальным. – Simon

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