4択クイズアプリ

【Android Studio】クイズアプリ開発講座 第4回「問題と選択肢を表示する」

Sara

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

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

前回はクイズを管理する配列を作成しました。

今回はその配列からクイズを取り出して画面に表示してみましょう。

問題と選択肢を表示する

1. 問題と選択肢のセット

まずはクイズ出題用のメソッドを作成します。

5〜23行目を追加します。

7行目:Warning の解消
countLabel.setText(getString(R.string.count_label, quizCount));

クイズ画面を作成したときに strings.xml に用意した文字列

<string name="count_label">Q%d</string>

の %d 部分に値をセットしています。

1つ目の引数には strings.xml に定義した文字列を R.string.名前 と書いて、2つ目の引数には %d 部分に入れる数値を指定します。

10行目
ArrayList<String> quiz = quizArray.get(0);

quizArrayから0番目のクイズを取り出しています。

取り出したクイズは

{"都道府県名", "正解", "選択肢1", "選択肢2", "選択肢3"}

の順番で要素が入っています。

questionLabel には都道府県名を表示するので quiz.get(0) で quiz 配列から取り出します。

questionLabel.setText(quiz.get(0));

rightAnswer には正解を入れておくので quiz.get(1) で quiz 配列から取り出します。

rightAnswer = quiz.get(1);

2. showNextQuiz を呼び出す

アプリを起動したらすぐにクイズが出題されるように、onCreate メソッド内で showNextQuiz メソッドを呼び出します。

5行目を追加します。

3. アプリを実行

アプリをエミュレータで実行してみましょう。

quizArray の最初の要素である「北海道」の問題と選択肢が表示されたでしょうか?

4. 出題順をシャッフル

Collections クラスには、ArrayList の要素をシャッフルできる shuffle メソッドが用意されています。

たった1行書くだけで出題順をシャッフルすることができます。

5行目を追加します。

5. 選択肢をシャッフル

次にボタンに表示する選択肢をシャッフルします。

quizArray は「ArrayList の中に ArrayList を入れた2次元 ArrayList」にしたので、取り出した quiz も ArrayList 型になっています。

同じように shuffle メソッドを使うことができますが、今回は都道府県を取り出してからシャッフルします。

showNextQuiz メソッドに15・18・27行目を追加、21〜24行目は添字を変更します。

15行目
quiz.remove(0);

都道府県名はボタンに表示する選択肢ではないので削除しておきます。

18行目
Collections.shuffle(quiz);

都道府県名は削除したので、この時点で quiz リストに残っているのは正解と3つの選択肢です。

これら4つの順番を shuffle メソッドを使ってシャッフルします。

シャッフルしてから解答ボタンにセットすることで、毎回違う順番で選択肢を表示できるようになります。

27行目
quizArray.remove(0);

同じクイズが出題されないように quizArray から問題を削除しておきます。

6. アプリを実行

クイズがランダムに表示されるかエミュレータで確認してみましょう。

ランダムに出題されるかを確認するために、一度アプリを終了して再度開いてみてください。

問題文が変わって、解答ボタンの順番もシャッフルされているでしょうか?

次に行うこと

次回はクイズアプリで一番重要な機能「正解・不正解の判定」を実装していきます。

ここまでのコード

Q
MainActivity.java
package com.example.quizapp;

import android.os.Bundle;

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 java.util.ArrayList;
import java.util.Collections;

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;
    private String rightAnswer;
    private int rightAnswerCount;
    private int quizCount = 1;

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

        // 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);
    }
}
Subscribe
Notify of
10 Comments
古い順
新しい順 人気順
Inline Feedbacks
View all comments
takuya
3 years ago

初めての質問失礼致します。
最近から勉強を始め、分かりやすく、楽しく勉強させて頂いております。
クイズアプリ開発のエラーについて2つ質問があります。
「//randomNumを使ってquizArrayからクイズをひとつ取り出す」の部分のコードの部分にエラーが出てしまいます。互換性のない型です、と出ます。どうしたら宜しいでしょうか。
また、「//正解をrightAnswerにセット」のコードでもエラーが出てしまいました。java.util.ArrayListのset(int.java.lang.String)は(int)に適用できません、と出ます。

以上となります。
初歩的な点かと思い恐縮ですが、ご教示頂けると嬉しいです。
宜しくお願い致します。

takuya
3 years ago

先ほどの質問した者です。
情報が抜けており失礼しました。
開発環境はwindows10、アンドロイドスタジオ(2021.11.15インストール)になります。
宜しくお願い致します。

石井徹
2 years ago

Sara様
お世話になります。
第4回まで、なんとか出来たので実行したのですが、
4つのエラーが表示されてうまくいきませんでした。
onClick method does not exist
ボタン1~4についてこのようなエラーが生じました。
どのあたりにミスがあったのかご教示いただけませんか。
よろしくお願いいたします。

石井徹
2 years ago

開発環境が記入漏れでしたすみません。
環境はwin10proで最新のandroid studio javaで行っています。
石井

fkd2015
1 year ago

初めての質問失礼致します。
Splitの右画面がエミュレータ画面だと思うのですが、表示される問題番号が%dのままだったりjavaファイルでアレンジした配列が問題文や選択肢にちっとも反映されないのですが、何かおかしいのでしょうか?
開発環境はAndroid Studio Flamingoです(2023年4月21日ダウンロード)

fkd2015
1 year ago
Reply to  Sara

先ほど質問したものです。
「エミュレータをAndroid Studioとは別ウィンドウで開く方法」を試してみたのですが、ただ「Launch in a tool window」の項目のチェックを外しただけなのに自分の作ったアプリが正しく動くようになりました。アドバイスありがとうございました!

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

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

POINT 01

動くコード

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

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

POINT 02

自分のペースで

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

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

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

POINT 03

個別サポート

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

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

今すぐ無料でお試し

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