4択クイズアプリ

【Android Studio】クイズアプリ開発講座 第5回「正解・不正解を判定する」

Sara

Android Studio Ladybug | 2024.2.1 に対応しました(2024年11月)

ここまでの記事はこちら
Kotlin バージョンはこちら

今回はクイズの正解・不正解を判定できるようにしていきます。

クイズの正解・不正解はダイアログを使って表示してみましょう。

正解・不正解を判定する

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 ボタンを押さないとダイアログを閉じることはできません。

ダイアログの表示には DialogFragment を使うべきですが、このクイズでは画面を固定すると想定していること、より簡単に実装することを理由に使用していません。講座の完全版では DialogFragment を使う方法も紹介しています。

4. アプリを実行

エミュレータでアプリを実行してみて下さい。

正解・不正解の判定が正しく行われ、クイズが連続して出題されるでしょうか?

上手く動かない場合は下にサンプルコードを貼ってあるので確認してみてください。

結果画面を作成していないので、5問目終了時のダイアログで「OK」ボタンを押すとアプリが強制終了されてしまいます。現時点では問題ないので、このまま進んでください。

次に行うこと

これでメインのクイズ機能は完成です!

次回からは結果画面を作成していきましょう。

ここまでのコード

Q
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();
    }
}

Subscribe
Notify of
0 Comments
古い順
新しい順 人気順
Inline Feedbacks
View all comments
ABOUT ME
Sara
Sara
運営者
書籍やオンライン講座でプログラミングを勉強してフリーランスのプログラマーになりました。
このサイトでは「わかりやすく・シンプル」をモットーに、プログラミングの基礎からアプリ開発まで紹介します。
独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています。
主な使用言語:Java / Kotlin / PHP
>> 詳しいプロフィール
>> お問い合わせ
>> 書籍を出版しました!
本格的に学びたい方へ

Code for Fun プログラミング講座

POINT 01

動くコード

プログラミングの文法を学んでも、そこからどのようにアプリ開発ができるのかイメージが湧きにくいものです。

Code for Fun のプログラミング講座では、ゲームやカレンダーなどアプリとして機能するものを作りながらプログラミングを学ぶことができます。

POINT 02

自分のペースで

オンライン講座なので、ご自身のペースで学習を進めて頂けます。

受講期限もないので、いつでも前のレッスンに戻ることができるので安心です。

お申し込みしたその日からすぐに始めることができます。

POINT 03

個別サポート

プログラミング学習では、エラーが起きることはよくあります。そんな時はお気軽にお問い合わせください!

コメント欄またはメールによるサポートを回数無制限でご利用頂けます。(*講座に関連するご質問のみ対応)

今すぐ無料でお試し

0
この記事にコメントするx
記事URLをコピーしました