【Android Studio】クイズアプリ開発講座 第4回「問題と選択肢を表示する」
ここまでの記事はこちら
前回はクイズを管理する配列を作成しました。
今回はその配列からクイズを取り出して画面に表示してみましょう。
解説
1. クイズ出題用のメソッド
5~36行目を追加してください。
必要な import
2つの import 文が追加されます。
import java.util.Collections;
import java.util.Random;
Random が自動的に追加されない場合は、青いメッセージが出ている状態で Alt と Enter を同時に押します(Mac の場合は Option と Enter)。
Random (java.util) を選択してください。
7行目:Warning の解消
countLabel.setText("Q" + quizCount);
文字列の上にカーソルを合わせると Do not concatenate text displayed with setText. Use resource string with placeholders. と表示されます。
これは「文字列を連結しないで、string リソースでプレースホルダーを使ってください」という Warning です。
string リソースとは strings.xml ファイルのことで、プレースホルダーは strings.xml に定義した「Q%d」の %d のことです。
クイズ画面を作成した時に strings.xml に書いた
<string name="count_label">Q%d</string>
の %d の部分に、問題番号を入れて表示してみましょう。
countLabel.setText(“Q” + quizCount); を以下のように書き換えてください。
countLabel.setText(getString(R.string.count_label, quizCount));
getString メソッドを使って strings.xml に定義した文字列を R.string.名前 と書いて取り出します。第二引数には %d の部分に入れる数値を指定します。
Warning が消えましたね。
10・11行目:ランダムな数字
quizArrayからランダムにクイズを取り出すために、ランダムな数字を生成します。
nextInt() メソッドを使うと「0から指定した値未満の整数」を返してくれます。
例えば
random.nextInt(5)
は 0から5未満の整数、つまり0・1・2・3・4のどれかを返します。
このアプリでは quizArray からランダムにクイズを取り出したいので、0から配列の要素数マイナス1の範囲でランダムな数字を生成しています。
ArrayList<String> quiz の中身
ArrayList<String> quiz には、この順番で要素が入っています。
{"都道府県名", "正解", "選択肢1", "選択肢2", "選択肢3"}
questionLabel には都道府県名を表示するので quiz.get(0) で quiz 配列から取り出します。
questionLabel.setText(quiz.get(0));
rightAnswer には正解を入れておくので quiz.get(1) で quiz 配列から取り出します。
rightAnswer = quiz.get(1);
26行目:選択肢のシャッフル
Collections.shuffle(quiz);
都道府県名は23行目で削除しているので、この時点で quiz 配列に残っているのは「正解と3つの選択肢」です。
これら4つの順番を Collections クラスの shuffle メソッドを使ってシャッフルします。
シャッフルしてから解答ボタンにセットすることで、毎回違う順番で選択肢を表示できるようになります。
35行目:クイズを削除
quizArray.remove(randomNum);
同じ問題が出題されないように、quizArray から忘れずに削除しておきましょう。
2. showNextQuiz を呼び出す
アプリを起動して MainActivity が呼び出されたときにクイズが出題されるように showNextQuiz メソッドを呼び出します。
onCreate メソッドに4行目を追加します。
3. エミュレーターで確認する
ここまでのコードが上手く動くかエミュレーターで確認してみましょう!
クイズが表示されましたか?
ランダムに出題されるかを確認するために、一度アプリを終了して再度開いてみてください。
問題文が変わって、解答ボタンの順番もシャッフルされているでしょうか?
上手く表示されない場合は、最後にサンプルコードを貼ってあるので比較してみてください。
次に行うこと
次回はクイズアプリで一番重要な機能「正解・不正解の判定」を実装していきます。
ここまでのコード
- MainActivity.java
初めての質問失礼致します。
最近から勉強を始め、分かりやすく、楽しく勉強させて頂いております。
クイズアプリ開発のエラーについて2つ質問があります。
「//randomNumを使ってquizArrayからクイズをひとつ取り出す」の部分のコードの部分にエラーが出てしまいます。互換性のない型です、と出ます。どうしたら宜しいでしょうか。
また、「//正解をrightAnswerにセット」のコードでもエラーが出てしまいました。java.util.ArrayListのset(int.java.lang.String)は(int)に適用できません、と出ます。
以上となります。
初歩的な点かと思い恐縮ですが、ご教示頂けると嬉しいです。
宜しくお願い致します。
はじめまして、当サイトを見つけていただきありがとうございます!
以下のサンプルコードでテストしたところ問題ありませんでしたので、もう一度ご自身のコード(特に ArrayList 周辺)をご確認ください。
https://codeforfun.jp/android-studio-4x-quiz-game-4/#i-3
2つ目のエラーは1つ目のエラーが解決できれば解消するはずです。
サンプルコードを使ってもエラーになってしまう場合は、コードのスクリーンショット添付して頂ければと思います。
先ほどの質問した者です。
情報が抜けており失礼しました。
開発環境はwindows10、アンドロイドスタジオ(2021.11.15インストール)になります。
宜しくお願い致します。
Sara様
お世話になります。
第4回まで、なんとか出来たので実行したのですが、
4つのエラーが表示されてうまくいきませんでした。
onClick method does not exist
ボタン1~4についてこのようなエラーが生じました。
どのあたりにミスがあったのかご教示いただけませんか。
よろしくお願いいたします。
当サイトを見つけて頂きありがとうございます!
をご確認ください。
onClick 属性を使った書き方は非推奨となっていますが、この記事では考慮せずに進めています。
もし onClickListener を使ってコードをお書きになっている場合は checkAnswer メソッドではなく、onClick メソッドを書いているかをご確認ください。
開発環境が記入漏れでしたすみません。
環境はwin10proで最新のandroid studio javaで行っています。
石井
初めての質問失礼致します。
Splitの右画面がエミュレータ画面だと思うのですが、表示される問題番号が%dのままだったりjavaファイルでアレンジした配列が問題文や選択肢にちっとも反映されないのですが、何かおかしいのでしょうか?
開発環境はAndroid Studio Flamingoです(2023年4月21日ダウンロード)
当サイトを見つけていただきありがとうございます!
Splitの右側は「プレビュー画面」なので、activity_main.xml に書いたものが反映されているだけの状態です。
問題番号や問題文はアプリを実行する(エミュレータで動かす)と反映されます。
エミュレータも右側に表示されるので分かりにくいかもしれませんがご確認ください。
参考までに、エミュレータを Android Studio とは別ウィンドウで開く方法を以下のページで紹介しています。
https://codeforfun.jp/android-studio-how-to-run-emulator-in-a-separate-window/
先ほど質問したものです。
「エミュレータをAndroid Studioとは別ウィンドウで開く方法」を試してみたのですが、ただ「Launch in a tool window」の項目のチェックを外しただけなのに自分の作ったアプリが正しく動くようになりました。アドバイスありがとうございました!
ご報告ありがとうございます。
動いたとのこと良かったです!