4択クイズアプリ

【Android Studio】クイズアプリ開発講座 第3回「クイズを準備する」

Sara

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

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

クイズ画面は完成したので、今回はクイズ出題に必要な変数や配列を準備します。

MainActivity.java を開いて始めていきましょう。

クイズを準備する

1. ViewBinding の設定

MainActivity.java では問題文や選択肢を書き換えるコードを書くので、id を使って TextView と Button を取得します。

findViewById メソッドを使うのが一般的で、以下のように書くことができます。

これでもコードは動きますが、少し面倒ですし、無効な ID や間違った型を指定してしまうリスクもあります。

今回は ViewBinding を使って簡単に TextView や Button にアクセスできるようにしましょう。

Android Studio 左側のプロジェクト構造から Gradle Scripts → build.gradle.kts(Module :app) を開きます。

12〜14行目のコードを追加します。

画面右上の Sync Now を押します。

MainActivity.java を開いて、3・9・10行目を追加・変更します。

以上で ViewBinding を使う準備ができました。

今後は

TextView countLabel = findViewById(R.id.countLabel);

と書く必要はなく

binding.countLabel

で TextView や Button を操作できるようになります。

2. 変数の用意

4〜6行目を追加します。

rightAnswer

正解を入れるために使います。

rightAnswerCount

正解数をカウントするために使います。

quizCount

何問目を出題しているのかをカウントするために使います。

3. クイズデータの用意

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

5行目

クイズのデータを管理するための配列を用意します。

6行目〜

クイズデータを多次元配列で作成します。

ArrayList と多次元配列についてはこのあと紹介します。

4. クイズ配列の用意

quizData 配列を使って、クイズを出題するための ArrayList を用意していきます。

onCreate メソッドに8〜22行目のコードを追加してください。

ここで簡単に

  1. 基本的な配列
  2. 多次元配列
  3. ArrayList

の違いを紹介します。

型は String(文字列)を例に紹介していますが、Integer(数値)など他の型でも使い方は同じです。 

① 基本的な配列

String[] colors = {"赤", "青", "緑"};

colors[0] → 赤
colors[1] → 青
colors[2] → 緑

で取り出すことができます。

② 多次元配列

基本的な配列の中に配列を入れている形です。

String[][] colors = {
    {"赤", "ピンク", "オレンジ"},
    {"青", "水色", "ネイビー"},
    {"緑", "黄緑", "深緑"}
};

colors[0][0] → 赤
colors[1][1] → 水色
colors[2][2] → 深緑

で取り出すことができます。

③ ArrayList

基本的な配列と同じですが、配列の大きさを決めなくて良いのが ArrayList です。

例えば5個の要素を持つ配列の場合、基本的な配列では

String[] str = new String[5];

または

String[] str = {"あ", "い", "う", "え", "お"};

と書いて、あらかじめ要素数を決めておく必要があります。

ArrayList の場合は、要素数を決めておく必要はありません。

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

まず10個の要素を格納できるように作成され、その後10個を超えると自動的に拡張してくれます。

例えばクイズ用に配列を使う場合、問題を追加することもありますし、クイズのレベルによって問題数が変わるかもしれません。そのたびに配列の大きさを変更するのは面倒ですし、問題数が多くなったら数えるのも大変です。

このように配列の大きさがどのくらい必要になるか分からない時に使えるのが ArrayList です。

このクイズでは少し応用して ArrayList を多次元配列の形で用意しました。

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

通常、型には String や Integer を使用しますが、今回は ArrayList の多次元配列バージョンです。ArrayList の中に ArrayList を入れていくので、型は ArrayList<String> としています。

5. コードの補足説明

さきほど書いたコードでは

  1. for ループを使って quizData からクイズを1問づつ取り出す
  2. tmpArray に問題・正解・選択肢を追加する
  3. quizArray に tmpArray を追加(ArrayList の中に ArrayList を入れる)

ということをしています。

なぜ quizData 配列から ArrayList 配列にわざわざ書きなおすのかと言うと、クイズには欠かせないシャッフル機能を簡単に実装するためです。

また、この講座の後半で SQLite データベースでのクイズ管理方法を紹介していきます。その時に ArrayList で用意しておく方が便利なので、このような書き方をしています。

tmpArrayとは?

tmpArray の tmpは「temporary」の略で「一時的」という意味です。temp と書くこともあります。一時的にしか使わない変数名によく使われるので、覚えておくと便利な書き方です。

6. Warningについて

現在 for ループの for の部分に Warning が出ていると思います。

for の上にカーソルをあわせると ‘for’ loop replaceable with enhanced ‘for’ と表示されます。

これは「for ループをより良い方法で書き換えることができます」という Warning です。

左側に表示される豆電球のマークをクリックして、Replace with enhanced ‘for’ を選択します。

for ループが書き換わって Warning が消えたことが確認できると思います。

この書き方は「quizData 配列から要素を quizDatum という名前で一つずつ取り出す」という方法です。

for (String[] quizDatum : quizData) {

今まで quizData[i] と書いていた部分が quizDatum にあたるので、都道府県名の取り出し方が

tmpArray.add(quizData[i][0]);

から

tmpArray.add(quizDatum[0]);

に変わっています。

どちらの書き方でも良いですが、for ループに慣れるまでは配列のイメージをつかみやすい for (int i = 0; i < quizData.length; i++) で書くことをオススメします。

配列の使い方に慣れてきたら for (String[] quizDatum : quizData) を使って、効率的なコードを書いていきましょう。

次に行うこと

クイズを出題するための準備は完了です。

次回は quizArray からクイズを取り出して表示してみましょう!

ここまでのコード

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;

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);
        }
    }
}
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をコピーしました