Muhammad Catubig Muhammad Catubig - 7 months ago 8
Java Question

Incorrect when the answer is correct Android Quiz app

I am trying to develop a quiz app where I manually write an array of questions and answers and then use these to set the radio button's and text view's text values. But, then when I try to run it and play with it, at the first set of question, it was fine then next the correct answer became incorrect and vice versa. Screenshots below.

The correct one when I pressed the correct one.

enter image description here

The incorrect one but I've pressed the correct one (You know the answer).

enter image description here

It seems to me that the first set of question's values were not moved. I tried everything I can think of but no luck. I see what happens in my logcat when I tried to print out the current text. Here's a snippet from my logcat.

04-24 01:56:10.880 4093-4093/com.example.muhammad.exquizme D/answer: Google
04-24 01:56:10.880 4093-4093/com.example.muhammad.exquizme D/correctAnswer: Google
04-24 01:56:10.885 4093-4093/com.example.muhammad.exquizme D/Is it correct?: Correct
04-24 01:56:10.894 4093-4147/com.example.muhammad.exquizme W/OpenGLRenderer: Fail to change FontRenderer cache size, it already initialized
04-24 01:56:32.322 4093-4093/com.example.muhammad.exquizme D/answer: Google
04-24 01:56:32.322 4093-4093/com.example.muhammad.exquizme D/correctAnswer: An algorithm
04-24 01:56:32.326 4093-4093/com.example.muhammad.exquizme D/Is it correct?: Incorrect


Here's the code for that part.

QuizQuestion[] questionArray; //global variable
int randomIndex;//global variable

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

qIndexView = (TextView) findViewById(R.id.currentNumber);
questionTextView = (TextView) findViewById(R.id.questionTextView);
choiceBtnA = (RadioButton) findViewById(R.id.choiceA);
choiceBtnB = (RadioButton) findViewById(R.id.choiceB);
choiceBtnC = (RadioButton) findViewById(R.id.choiceC);
choiceBtnD = (RadioButton) findViewById(R.id.choiceD);
questionArray = new QuizQuestion[5];

displayQuestion();


final String a = choiceBtnA.getText().toString();
final String b = choiceBtnB.getText().toString();
final String c = choiceBtnC.getText().toString();
final String d = choiceBtnD.getText().toString();

choiceBtnA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnswers(a);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
displayQuestion();
}
}, 2000);

//displayQuestion();
}
});

choiceBtnB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnswers(b);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
displayQuestion();
}
}, 2000);
}
});

choiceBtnC.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnswers(c);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
displayQuestion();
}
}, 2000);
}
});

choiceBtnD.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnswers(d);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
displayQuestion();
}
}, 2000);
}
});
}

//This is called every pressed
public void displayQuestion() {

//Create Question list
String theQuestion = "Android mobile operating system was released on 23rd September 2008 developed by who?";
String[] choices = new String[]{"Google", "IBM", "Intel", "Oracle"};
questionArray[0] = new QuizQuestion(theQuestion, choices, choices[0], "Computing History");

theQuestion = "Who invented the programming language called 'Java'?";
choices = new String[]{"James Gosling", "Steve Jobs", "Bill Gates", "Elon Musk"};
questionArray[1] = new QuizQuestion(theQuestion, choices, choices[0], "Computing History");

theQuestion = "Which of the following languages is more suited to a structured program?";
choices = new String[]{"FORTRAN", "BASIC", "PASCAL", "None of the above"};
questionArray[2] = new QuizQuestion(theQuestion, choices, choices[3], "Computer Fundamentals");

theQuestion = "The brain of any computer system is";
choices = new String[]{"Memory", "ALU", "CPU", "Control unit"};
questionArray[3] = new QuizQuestion(theQuestion, choices, choices[2], "Computer Fundamentals");

theQuestion = "The step-by-step instructions that solve a problem are called _____.";
choices = new String[]{"An algorithm", "A list", "A plan", "A sequential structure"};
questionArray[4] = new QuizQuestion(theQuestion, choices, choices[0], "System Analysis and Design");

randomIndex = new Random().nextInt(questionArray.length);

questionTextView.setText(questionArray[randomIndex].question);
choiceBtnA.setText(questionArray[randomIndex].choices[0]);
choiceBtnB.setText(questionArray[randomIndex].choices[1]);
choiceBtnC.setText(questionArray[randomIndex].choices[2]);
choiceBtnD.setText(questionArray[randomIndex].choices[3]);

}

//checks answer when clicked
public boolean checkAnswers(String answer) {
Log.d("answer", answer);
String correctAnswer = questionArray[randomIndex].answer;
Log.d("correctAnswer", correctAnswer);
if (answer.equals(correctAnswer)) {
Toast.makeText(PlayQuizActivity.this, "Correct", Toast.LENGTH_SHORT).show();
Log.d("Is it correct?", "Correct");
return true;
} else {
Toast.makeText(PlayQuizActivity.this, "Incorrect", Toast.LENGTH_SHORT).show();
Log.d("Is it correct?", "Incorrect");
}

return false;
}


That's all I have at the moment. Let me know if you need clarification coz my english is not that good. Thanks in advance.

Answer

After you display the first question, you're saving the Buttons' initial text as the answers, but they're not getting updated when you move to the next question.

You need to get the Buttons' current text when clicking. Change the calls to checkAnswers() in the onClick() methods to checkAnswers(choiceBtnA.getText().toString());, checkAnswers(choiceBtnB.getText().toString());, etc.

Alternatively, you could get the answer String from questionArray instead. For example, checkAnswers(questionArray[randomIndex].choices[0]);, checkAnswers(questionArray[randomIndex].choices[1]);, etc.

Furthermore, you could trim down the code a little by passing an int representing the Button's index into checkAnswers() instead, and just grab the selected answer there.

choiceBtnA.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        checkAnswers(0);
        ...
    }
});

...

public boolean checkAnswers(int index) {
    String answer = questionArray[randomIndex].choices[index];
    String correctAnswer = questionArray[randomIndex].answer;
    ...
}