クイズ結果の表示とハイスコアを保存

目次

はじめに

結果画面にクイズの正解数を表示して、トータルスコアを保存できるようにしていきます。

今回、intent(インテント)SharedPreferences(シェアードプレファレンシズ)というものを使っていきます。

画面遷移とデータ保存に欠かせないもので、アプリ開発でとてもよく使われます。いつでもサクッと実装できるように覚えておくと便利だと思います。

それでは、はじめていきましょう!

動画

Android Studio バージョンについて

動画では Android Studio 3.1.4 を使用していますが 3.6 でも動作確認済みです。

テキスト

1. 正解数をResultActivity.javaに渡す

まずは正解数を ResultActivity.java で表示できるように、MainActivity.java(クイズ画面)から rightAnswerCount(正解数)を ResultActivity(結果画面)へ渡します。


MainActivity.java を開いて、6~8行目を追加してください。

 

必要なimport

前回までと同様に「alt + return」を押して警告を消します。

追加されるimportはこの1行です。

import android.content.Intent;

 

Intent(インテント)とは?

新しくアクティビティ(ResultActivity)を開く場合は Intent(インテント)を使います。

Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
startActivity(intent);

まずインテントを作成し、startActivity に渡すことで結果画面を表示することができます。

 

今回は rightAnswerCount(正解数)を ResultActivity(結果画面)で使いたいので、 インテントを startActivity に渡す前に、この1行を書いています。

intent.putExtra("RIGHT_ANSWER_COUNT", rightAnswerCount);

putExtra(取り出す時に使うキー, 渡したい値) のように使います。

キーは String(文字列)ですが、値は String, int, float などをセットすることができます。

 

2. 正解数の表示

次に、結果画面で正解数を表示します。

ResultActivity.java を開いて、6~8行目を追加してください。

 

正解数を取得

int score = getIntent().getIntExtra("RIGHT_ANSWER_COUNT", 0);

先ほど MainActivity.java で設定したキーを使って、正解数を取得します。

正解数は int 型だったので、getIntExtra() を使います。

書き方は getIntExtra(キー, 値が取得できなかった場合の値) となります。

 

正解数を表示

resultLabel.setText(score + " / 5");

findViewById で取得した resultLabel に正解数を「3 / 5」と表示します。

 

「5問中3問正解」と表示したい場合は、このように書いてみてください。

resultLabel.setText("5 問中 " + score + " 問正解");

 

3. トータルスコアの表示・保存

次に累計正解数をトータルスコアとして表示・保存してみます。

アプリにデータを保存するには

  • SharedPreferences
  • SQLiteデータベース
  • テキストファイル

を使う方法がありますが、今回は一番手軽に使える SharedPreferences 紹介します。

 

以下のコードを追加します。

見やすいように順番を変えてコメントも書きましたが、

新たに追加したコードは 7・13・14・17・21・24~26 行目です。

 

必要なImport

「alt + return」を押して警告を消します。

追加されるimportはこの2行です。

import android.content.Context;
import android.content.SharedPreferences;

 

SharedPreferences の準備

まずは SharedPreferences を使えるようにします。

13行目 SharedPreferences prefs = getSharedPreferences("quizApp", Context.MODE_PRIVATE);

getSharedPreferences(データの名前, モード)のように書きます。

モードには、他のアプリからも読み書きできる

がありますが、ここでは他のアプリからはアクセスできない MODE_PRIVATE にします。

 

トータルスコアを取り出す

14行目 int totalScore = prefs.getInt("totalScore", 0);

getInt(キー, データが無かった場合の数値) のように書きます。

初めてクイズに挑戦した時は、まだトータルスコアが保存されていないので0が返ってきます。

 

トータルスコアを表示する

SharedPreferences から取得したトータルスコアに今回のクイズの正解数を加算して、 最新のトータルスコアを表示します。

17行目 totalScore += score;
21行目 totalScoreLabel.setText("トータルスコア : " + totalScore);

 

トータルスコアを保存する

24行目 SharedPreferences.Editor editor = prefs.edit();
25行目 editor.putInt("totalScore", totalScore);
26行目 editor.apply();

putInt(キー, 保存する値)のようにデータをセットします。

 

注意して頂きたいのが、読み出し時・書き込み時のキーを必ず合わせることです。

読み出し時 prefs.getInt("totalScore", 0);
書き込み時 editor.putInt("totalScore", totalScore);

ここが一致しないと保存できても読み出せなくなってしまうのでお気をつけください。

最後にapply()で保存します。

 

SharedPreferences 使い方のヒント

今回はトータルスコアを保存しましたが、ハイスコアやユーザー名、最後にクイズに挑戦した日など色々な使い方ができると思います。
トータルスコア以外にもデータを保存したい場合は、キーを変えることで複数のデータを保存することもできます。
例えば、トータルスコアに加えて、このようにユーザー名を読み書きすることもできます。

String userName = prefs.getString("KEY_NAME", "名無しさん");
editor.putString("KEY_NAME", userName);


ぜひ工夫して使ってみてください。

まとめ

これで「もどるボタン」以外の結果画面は完成です!

次はクイズのカテゴリを選択できるスタート画面を作っていきます。

「もどるボタン」はスタート画面を作ってから実装しますので、少しお待ちください🙂


ここまでのコード

コメント

2 コメント