【Android Studio】クイズアプリ開発講座 第5回「正解・不正解を判定する」
今回はクイズの正解・不正解を判定できるようにしていきます。
クイズの正解・不正解はダイアログを使って表示してみましょう。
正解・不正解を判定する
1. クイズの出題数を設定
まずは「クイズを何問出題するか」を決めます。
3行目を追加してください。
ここではクイズを5問出題するように設定しました。
10問出題したい場合は
private static final int QUIZ_COUNT = 10;
としてください。
出題済みのクイズは quizArray から削除されていきます。出題数は quizArray の要素数を超えない範囲に設定してください。
2. クリックリスナーの用意
ボタンを押したときに処理を実行するためにクリックリスナーを用意します。
1行目の implements・15〜18行目・27〜30行目を追加します。
3. onClickメソッド
ボタンが押されたら呼ばれる onClick メソッドにコードを書いていきましょう。
8〜35行目を追加します。
8・9行目:どの解答ボタンが押されたかを取得
Button answerBtn = findViewById(view.getId());
String btnText = answerBtn.getText().toString();
どのボタンが押されても onClick メソッドが呼ばれるので「どのボタンが押されたのか」を調べる必要があります。
ここでは押された解答ボタンを見つけて、そのボタンのテキストを取得しています。
12~17行目:正解・不正解の判定
12行目では解答ボタンのテキストと rightAnswer が一致するかで正解・不正解を判定しています。
if (btnText.equals(rightAnswer)) {
alertTitle = "正解!";
rightAnswerCount++;
} else {
alertTitle = "不正解…";
}
正解の場合は、このあと作成するダイアログのタイトルを「正解!」として、正解数をカウントする rightAnswerCount に1を加算します。
不正解の場合は、ダイアログのタイトルを「不正解…」とするだけです。
20行目〜:ダイアログを表示する
20行目からはダイアログを作成しています。
まずはタイトル・メッセージ・OKボタンを追加します。
23行目からは OK ボタンが押された時の処理を書いています。
if (quizCount == QUIZ_COUNT) {
// 結果画面へ移動
} else {
quizCount++;
showNextQuiz();
}
最初に設定した出題数 QUIZ_COUNT と quizCount が同じになったら結果画面に移動します。
QUIZ_COUNT に達していない場合は quizCount に1を足して、再び showNextQuiz メソッドを呼びます。
これでクイズを続けて出題できるようになります。
34行目の setCancelable はダイアログの外側をタップしたときにダイアログを閉じるかどうかを指定しています。
false にしているので OK ボタンを押さないとダイアログを閉じることはできません。
4. アプリを実行
エミュレータでアプリを実行してみて下さい。
正解・不正解の判定が正しく行われ、クイズが連続して出題されるでしょうか?
上手く動かない場合は下にサンプルコードを貼ってあるので確認してみてください。
結果画面を作成していないので、5問目終了時のダイアログで「OK」ボタンを押すとアプリが強制終了されてしまいます。現時点では問題ないので、このまま進んでください。
次に行うこと
これでメインのクイズ機能は完成です!
次回からは結果画面を作成していきましょう。
ここまでのコード
- MainActivity.java
-
package com.example.quizapp; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.widget.Button; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.example.quizapp.databinding.ActivityMainBinding; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.ArrayList; import java.util.Collections; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ActivityMainBinding binding; private String rightAnswer; private int rightAnswerCount; private int quizCount = 1; private static final int QUIZ_COUNT = 5; private ArrayList<ArrayList<String>> quizArray = new ArrayList<>(); private String[][] quizData = { // {"都道府県名", "正解", "選択肢1", "選択肢2", "選択肢3"} {"北海道", "札幌市", "長崎市", "福島市", "前橋市"}, {"青森県", "青森市", "広島市", "甲府市", "岡山市"}, {"岩手県", "盛岡市","大分市", "秋田市", "福岡市"}, {"宮城県", "仙台市", "水戸市", "岐阜市", "福井市"}, {"秋田県", "秋田市","横浜市", "鳥取市", "仙台市"}, {"山形県", "山形市","青森市", "山口市", "奈良市"}, {"福島県", "福島市", "盛岡市", "新宿区", "京都市"}, {"茨城県", "水戸市", "金沢市", "名古屋市", "奈良市"}, {"栃木県", "宇都宮市", "札幌市", "岡山市", "奈良市"}, {"群馬県", "前橋市", "福岡市", "松江市", "福井市"}, }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); binding.answerBtn1.setOnClickListener(this); binding.answerBtn2.setOnClickListener(this); binding.answerBtn3.setOnClickListener(this); binding.answerBtn4.setOnClickListener(this); // quizDataからクイズ出題用のquizArrayを作成する for (int i = 0; i < quizData.length; i++) { // 新しいArrayListを準備 ArrayList<String> tmpArray = new ArrayList<>(); // クイズデータを追加 tmpArray.add(quizData[i][0]); // 都道府県名 tmpArray.add(quizData[i][1]); // 正解 tmpArray.add(quizData[i][2]); // 選択肢1 tmpArray.add(quizData[i][3]); // 選択肢2 tmpArray.add(quizData[i][4]); // 選択肢3 // tmpArrayをquizArrayに追加する quizArray.add(tmpArray); } Collections.shuffle(quizArray); showNextQuiz(); } private void showNextQuiz() { // クイズカウントラベルを更新 binding.countLabel.setText(getString(R.string.count_label, quizCount)); // quizArrayからクイズを1つ取り出す ArrayList<String> quiz = quizArray.get(0); // 問題文(都道府県名)を表示 binding.questionLabel.setText(quiz.get(0)); // 正解をrightAnswerにセット rightAnswer = quiz.get(1); // クイズ配列から問題文(都道府県名)を削除 quiz.remove(0); // 正解と選択肢3つをシャッフル Collections.shuffle(quiz); // 解答ボタンに正解と選択肢3つを表示 binding.answerBtn1.setText(quiz.get(0)); binding.answerBtn2.setText(quiz.get(1)); binding.answerBtn3.setText(quiz.get(2)); binding.answerBtn4.setText(quiz.get(3)); // このクイズをquizArrayから削除 quizArray.remove(0); } @Override public void onClick(View v) { // どの解答ボタンが押されたか Button answerBtn = findViewById(v.getId()); String btnText = answerBtn.getText().toString(); String alertTitle; if (btnText.equals(rightAnswer)) { alertTitle = "正解!"; rightAnswerCount++; } else { alertTitle = "不正解..."; } // ダイアログを作成 new MaterialAlertDialogBuilder(this) .setTitle(alertTitle) .setMessage("答え : " + rightAnswer) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (quizCount == QUIZ_COUNT) { // 結果画面へ移動 } else { quizCount++; showNextQuiz(); } } }) .setCancelable(false) .show(); } }