4択クイズアプリ

Android Studio 4択クイズアプリ開発講座 第5回「正解・不正解チェック」

 

この記事は Android Studio 3.x / 4.0.1 に対応しています。
Android Studio 4.1 以降のバージョンをお使いの方はこちらをお読み下さい。

 
 

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

第2回「クイズ画面の作成」で、解答ボタンに android:onClick="checkAnswer" と書きました。
 

 

これは「このボタンが押されたら checkAnswer メソッドを呼びます」という意味です。
 

今回はこの checkAnswer メソッドを追加して、クイズの正解・不正解を判定できるようにします。正解・不正解は、画像のようにダイアログを使って表示します。
 

 

では MainActivity.java を開いて始めていきましょう!
 
 


 

動画

【Android Studio】4択クイズアプリ開発講座 #5 正解・不正解の判定

 
 

解説

クイズの出題数を設定する

まずはクイズを何問出題するかを決めます。

3行目を追加してください。

 
ここではクイズを5問出題するように設定しました。
 

10問出題したい場合は

static final private int QUIZ_COUNT = 10;

としてください。

出題済みのクイズはquizArrayから削除されていきます。出題数はquizArrayの要素数を超えない数値にしてください。

 
 

checkAnswerメソッド

5~36行目を追加します。

 

必要なimport

前回までと同じようにalt + returnで警告を消します。


 
 
追加されるのは、以下3つです。

import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.view.View;

 
 

どの解答ボタンが押されたかを取得

8行目 Button answerBtn = findViewById(view.getId());
9行目 String btnText = answerBtn.getText().toString();

押された解答ボタンを見つけて、そのボタンのテキストを取得しています。
 
 

正解・不正解の判定

12行目では、解答ボタンのテキストと rightAnswer が一致するかで、正解・不正解を判定しています。

if (btnText.equals(rightAnswer)) {
  alertTitle = "正解!";
  rightAnswerCount++;
} else {
  alertTitle = "不正解…";
}

正解の場合は、このあと作成するダイアログのタイトルを「正解!」として、正解数をカウントする rightAnswerCount に1を足します。

不正解の場合は、ダイアログのタイトルを「不正解…」とします。
 
 

ダイアログを表示する

20行目からはダイアログを作成しています。

まずは、タイトル・メッセージ・OKボタンを追加します。


 
 

23行目からはOKボタンが押された時の処理を書いています。

if (quizCount == QUIZ_COUNT) {
 // 結果画面へ移動
} else {
 quizCount++;
 showNextQuiz();
}

 
最初に設定した出題数 QUIZ_COUNT と quizCount が同じになったら、結果画面に移動します。QUIZ_COUNT に達していない場合は quizCount に1を足し、再び showNextQuiz メソッドを呼びます。
 

 
 

これでクイズを続けて出題できるようになります。
 
 

エミュレーターで確認

ここまで出来たらエミュレーターでアプリを起動してみてください。
正解・不正解の判定が正しく行われ、クイズが連続して出題されるでしょうか?

もし上手く動かない場合は、次のサンプルコードを確認してみてください。
 
 

ここまでのサンプルコード

Warning が出ている箇所があると思いますが、最後に修正するのでそのままにしておいて下さい。

 

次に行うこと

次回はクイズ結果を表示する画面を作成していきます。

第6回「結果画面の作成」に進む
 
 

クイズアプリ開発講座の完全版について


 

もっとアプリ開発をしてみたい!自分のアプリをリリースしたい!という方のために、この講座の完全版をご用意しました。
 

完全版では

  • SQLite Databaseを使ってのクイズ管理
  • クイズカテゴリの選択
  • 正解・不正解の効果音
  • AdMob バナー・インタースティシャル広告
  • Image Asset Studio(アイコン作成ツール)の使い方

などを実装していきます。
 

これらのコードはクイズアプリ以外にも利用できるコードばかりなので、今後アプリを開発していく時に必ず役立つと思います。
 
 

さらに3つの特典

  1. Google Play Games リーダーボード・実績の実装方法
  2. 画像を使ったクイズアプリの作り方
  3. 答えを入力するクイズアプリの作り方

もご用意しました。
 

講座ボーナス

 
 

全手順の動画付きで、アプリの開発から公開・アップデートまで出来る講座になっています。

初めてアプリを作るという方もぜひ挑戦してみてください
 

 
 

ABOUT ME
Sara
「わかりやすく・シンプル」をモットーに、スマホアプリ・ウェブアプリの作り方を紹介します。 独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています🙂
guest
9 Comments
古い順
新しい順 人気順
Inline Feedbacks
View all comments
lia
lia
11 months ago

質問させていただきます。

最後に

builder.setCancelable(false);
builder.show();

とありますが、この部分のソースの意味が調べても分からなかったので教えていただきたいです。builderパターンという仕組みらしいのですが、正直よくわかりませんでした。

実際に自分の手で動かした(ソースは全て参照させていただきましたが)、このクイズアプリを実行例にbuilderの説明を聞かせていただければ、理解しやすいかなと思い、質問させていただきました。

お時間がありましたら、ご教授よろしくお願いいたします。

lia
lia
11 months ago
Reply to  Sara

ありがとうございます!とても、分かりやすかったです。ほんとに、写経するようにSaraさんのコードを参照させていただいたので、どういう理論で動いているのか、気になるところが沢山あります笑。

AlertDialogクラスの中に、builderクラスが格納されているのですね。

それと、もう一つ気になることろが。

このクイズアプリを作成するにあたって、配列を四つ作っています。

そこが大雑把ではありますが、何故そんなに必要なのか、そして、どういう格納状況になっているのか頭が混乱しています。

例えば、tmpArrayをquizArrayに格納していますが、一次元配列のものを二次元配列に格納している状況が良くイメージできません。

もし、宜しければご回答宜しくお願い致します。

lia
lia
11 months ago

>「要素が配列になる」

ありがとうございます!分かりやすかったです!ここの部分で、理解できました笑。一次元配列を積み上げているイメージですね。

lia
lia
11 months ago
Reply to  Sara

前回のご回答ありがとうございました。

ダイアログのコードでまだ不明な点があったので、質問させていただきます。

不明点の一つは、setPositiveButtonメソッドで、第二引数の中にある処理です

インターフェースは、implementで実装するという認識なのですが、それを使っておらず混乱しました。。

さらに、クラスでないのにnewしたインスタンス化しており、さらに混乱しました。

調べたところ匿名クラスなるものらしいのですが、具体例を見てもこのコードとイメージが、結びつかず理解できませんでした。

不明点の二つ目はonClickLinstnerの内部にあるonClickメソッドの引数です。

第一引数はDialogInterfaceのコードを読んで押されたボタンを変数名dialogInterfaceで受け取るという理解をしました。

しかし、int iの方が良くわかりませんでした。どこで、整数型のiを使用しているのか理解に苦しみました。

長くなりましたが、この二つの不明点につてご教授いただければ幸いです。

lia
lia
11 months ago

なんども、ご回答いただいて本当に助かります。

>オーバーライドはメソッド名と引数の形式が同じメソッドを定義する必要があるので、ここで int i を使わなくても書く必要があります。

なるほど。そうだったのですね。int iは、ご回答いただくまでに、他の複数のボタンを識別するものと個人で理解していたので、やっと腑に落ちました。

>こちらも androidx/appcompat/app/AlertController.java や /android/content/DialogInterface.class で引数がどのように使われているか見ることができると思います。

なるほど。調べたり、質問する前にやるべきことをやっていませんでした。もっと、リファレンスやコードを読んでみます!ありがとうございました。

9
0
この記事にコメントするx