【Android Studio】クイズアプリ開発講座 第7回「結果の表示とスコアの保存」
今回は結果画面にクイズの正解数を表示して、トータルスコアを保存できるようにしていきます。
ここでは intent(インテント)と SharedPreferences(シェアードプレファレンシズ)というものを使います。
どちらもアプリ開発でよく使われるので、いつでもサクッと実装できるように覚えておくと便利だと思います。
それでは、はじめていきましょう!
結果の表示とトータルスコアの保存
1. ViewBinding の用意
クイズ画面と同じく ViewBinding を使えるようにします。
ResultActivity.java を開いて7・8行目を追加・変更します。
2. 正解数を結果画面に渡す
正解数を結果画面で表示できるように、rightAnswerCount(正解数)を MainActivity(クイズ画面)から ResultActivity(結果画面)へ渡します。
MainActivity.java の onClick メソッドに13〜15行目を追加します。
Intent(インテント)の使い方
新しくアクティビティを開くときは Intent(インテント)を使います。
Intent intent = new Intent(Context context, Class<?> cls);
startActivity(intent);
context(コンテキスト)には現在のアクティビティ、cls には 表示するアクティビティを Class オブジェクトで書きます。
作成したインテントを startActivity に渡すことでアクティビティを表示することができます。
今回は rightAnswerCount(正解数)を ResultActivity(結果画面)に渡すために、startActivity の前にこの1行を書いています。
intent.putExtra("RIGHT_ANSWER_COUNT", rightAnswerCount);
putExtra(取り出す時に使うキー, 渡したい値) と書くことで、遷移先のアクティビティに値を渡すことができます。
キーは String 型(文字列)ですが、値には String, int, float などをセットすることができます。
3. 正解数の表示
次に結果画面に正解数を表示します。
ResultActivity.java を開いて、5・6行目を追加します。
5行目:正解数を受け取る
int score = getIntent().getIntExtra("RIGHT_ANSWER_COUNT", 0);
先ほど値を渡す時に使ったキー RIGHT_ANSWER_COUNT を使って正解数を受け取ります。
正解数は int 型だったので、getIntExtra メソッドを使います。
書き方は getIntExtra(キー, 値が取得できなかった場合の値) となります。
6行目:正解数を表示
binding.resultLabel.setText(getString(R.string.result_score, score));
resultLabel に正解数を「3 / 5」と表示します。
クイズ画面の countLabel と同じように %d の部分に数値 score を入れています。
4. トータルスコアの表示・保存
次に累計正解数をトータルスコアとして表示・保存してみます。
アプリにデータを保存するには
- SharedPreferences
- SQLiteデータベース
- テキストファイル
を使う方法がありますが、今回は一番手軽に使える SharedPreferences を紹介します。
以下のコードを追加します。
見やすいように順番を変えてコメントも書きましたが、新たに追加したコードは 9・10・13・17・20〜22行目です。
9行目:SharedPreferences の準備
まずは SharedPreferences を使うための準備です。
SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
getPreferences(モード)のように書きます。
MODE_PRIVATE は「このアプリからのみ」アクセスできるモードです。
モードにはいくつか種類がありましたが、現在推奨されていないものが多いので MODE_PRIVATE を使うと覚えておけば問題ありません。
getPreference メソッドで保存した値は、1つのアクティビティでのみ有効になります。ですので、トータルスコアはクイズ画面(MainActivity)で呼び出すことはできません。複数のアクティビティで保存した値を扱う場合は getSharedPreferences(“ファイル名”, モード); と書きます。
10行目:トータルスコアを取り出す
int totalScore = prefs.getInt("TOTAL_SCORE", 0);
getInt(キー, データが無かった場合の数値) のように書きます。
初めてクイズに挑戦した時は、まだトータルスコアが保存されていないので 0 が返ってきます。
17行目:トータルスコアを表示する
binding.totalScoreLabel.setText(getString(R.string.result_total_score, totalScore));
SharedPreferences から取得したトータルスコアに今回のクイズの正解数を加算して(13行目)、最新のトータルスコアを表示します。
20〜22行目:トータルスコアを保存する
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("TOTAL_SCORE", totalScore);
editor.apply();
putInt(キー, 保存する値)のようにデータをセットします。
注意して頂きたいのが、読み出し時・書き込み時のキーを必ず合わせることです。
読み出し時 prefs.getInt("TOTAL_SCORE", 0);
書き込み時 editor.putInt("TOTAL_SCORE", totalScore);
ここが一致しないと保存できても読み出せなくなってしまうのでご注意ください。
最後にapply()で保存します。
SharedPreferences 使い方のヒント
今回はトータルスコアを保存しましたが、ハイスコアやユーザー名、最後にクイズに挑戦した日など色々な使い方ができると思います。
トータルスコア以外にもデータを保存したい場合は、キーを変えることで複数のデータを保存することもできます。
例えば、トータルスコアに加えて、このようにユーザー名を読み書きすることもできます。
読み出し時 String userName = prefs.getString("KEY_NAME", "名無しさん");
書き込み時 editor.putString("KEY_NAME", userName);
ぜひ工夫して使ってみてください。
5. アプリの実行
ここでアプリを実行してみてください。
正解数が ResultActivity に渡されて、結果画面に正しく表示されたでしょうか?
補足: もどるボタンについて
クイズ開始画面に遷移する「もどる」ボタンは講座の完全版でスタート画面を作成した後に実装します。
現時点でクイズ画面に遷移させたい場合は onCreate メソッド内に以下のコードを追加してください。
findViewById(R.id.returnBtn).setOnClickListener(view ->
startActivity(new Intent(ResultActivity.this, MainActivity.class)));
完成
お疲れ様でした!これで全て完成です!
ここまで読んで頂いてありがとうございました。
「アプリ開発って意外と簡単だな」と感じて頂けていれば嬉しい限りです。クイズ内容は自由にアレンジして構わないので、ぜひオリジナルのアプリを作ってみてくださいね。
【サンプルコード】Javaでつくるクイズアプリ講座(お試し版)
この講座の完全版では、さらにクイズアプリ開発を学ぶことができます。
受講期限なし、個別サポートあり、今すぐに始めることができます!
- クイズのカテゴリ別に出題する方法
- SQLite データベースを使った実装
- 効果音の再生
- 画像を使ったクイズアプリ
- 答えを入力するクイズアプリ
分かりやすい、説明で勉強になります。
質問ですが「もどる」ボタンの returnTop メソッドはどのように実装
すればいいでしょうか?
見落としていたらすみません。よろしくお願いいたします。
大塚さん、返信遅くなってしまい申し訳ありません。
こちらに追記しましたのでお試しください
https://codeforfun.jp/android-studio-4x-quiz-game-7/#i-5
質問失礼します
自分自身で作ったクイズを解き切ると突然アプリが落ちるのですが、何が原因なのでしょうか?
結果画面が表示されずにアプリが落ちてしまうということでしょうか?
どの程度ご自身でアレンジされているのか分からないので何とも言えないのですが、
・結果画面を作成しているのに表示されない→ Intent まわりのコードまたは結果画面のコードに問題あり
・結果画面を作成していない→結果画面を実装してみる
をお試しください。