【Android Studio】Kotlinでつくるクイズアプリ講座 第7回「結果の表示とトータルスコアの保存」
今回は結果画面にクイズの正解数を表示して、トータルスコアを保存できるようにしていきます。
ここでは intent(インテント)と SharedPreferences(シェアードプレファレンシズ)というものを使います。
どちらもアプリ開発でよく使われるので、いつでもサクッと実装できるように覚えておくと便利だと思います。
それでは、はじめていきましょう!
結果の表示とトータルスコアの保存
1. View Binding の用意
クイズ画面と同じく ViewBinding を使えるようにします。
ResultActivity.kt を開いて3・8・9行目を追加します。
2. 正解数を ResultActivity に渡す
正解数を結果画面に表示できるように、rightAnswerCount(正解数)を MainActivity(クイズ画面)から ResultActivity(結果画面)へ渡します。
MainActivity.kt の checkQuizCount 関数に4〜6行目を追加してください。
Intent(インテント)の使い方
新しくアクティビティを開くときは Intent(インテント)を使います。
val intent = 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.kt を開いて、5・8行目を追加します。
5行目:正解数を取得
val score = intent.getIntExtra("RIGHT_ANSWER_COUNT", 0)
値を渡す時に使ったキー RIGHT_ANSWER_COUNT を使って正解数を受け取ります。
正解数は Int 型だったので getIntExtra メソッドを使います。
書き方は getIntExtra(キー, 値が取得できなかった場合の値) となります。
8行目:正解数を表示
binding.resultLabel.text = getString(R.string.result_score, score)
resultLabel に正解数を「3 / 5」と表示します。
クイズ画面の countLabel と同じように %d の部分に数値 score を入れています。
4. トータルスコアの表示・保存
次に累計正解数をトータルスコアとして表示・保存してみます。
アプリにデータを保存するには
- SharedPreferences
- SQLiteデータベース
- テキストファイル
を使う方法がありますが、今回は一番手軽に使える SharedPreferences を紹介します。
以下のコードを追加します。
見やすいように順番を変えてコメントも書きましたが、新たに追加したコードは 8・9・12・16・19〜21 行目です。
8行目:SharedPreferences の準備
まずは SharedPreferences を使うための準備です。
val prefs = getPreferences(Context.MODE_PRIVATE)
getPreferences(モード)のように書きます。
MODE_PRIVATE は「このアプリからのみ」アクセスできるモードです。
モードにはいくつか種類がありましたが、現在推奨されていないものが多いので MODE_PRIVATE を使うと覚えておけば問題ありません。
補足
getPreference メソッドで保存した値は、1つのアクティビティでのみ有効になります。ですので、トータルスコアはクイズ画面(MainActivity)で呼び出すことはできません。
複数のアクティビティで保存した値を扱う場合は getSharedPreferences(“ファイル名”, モード) と書きます。
9行目:トータルスコアを取り出す
var totalScore = prefs.getInt("TOTAL_SCORE", 0)
getInt(キー, データが無かった場合の数値) のように書きます。
初めてクイズに挑戦した時は、まだトータルスコアが保存されていないので 0 が返ってきます。
トータルスコアはあとでスコアを加算するので、var にしています。
16行目:トータルスコアを表示する
binding.totalScoreLabel.text = getString(R.string.result_total_score, totalScore)
SharedPreferences から取得したトータルスコアに今回のクイズの正解数を加算して(12行目)、最新のトータルスコアを表示します。
19〜21行目:トータルスコアを保存する
val editor = prefs.edit()
editor.putInt("TOTAL_SCORE", totalScore)
editor.apply()
putInt(キー, 保存する値)のようにデータをセットします。
注意して頂きたいのが、読み出し時・書き込み時のキーを必ず合わせることです。
読み出し時 prefs.getInt(“TOTAL_SCORE“, 0)
書き込み時 editor.putInt(“TOTAL_SCORE“, totalScore
ここが一致しないと保存できても読み出せなくなってしまうのでご注意ください。
最後にapply()で保存します。
SharedPreferences 使い方のヒント
今回はトータルスコアを保存しましたが、ハイスコアやユーザー名、最後にクイズに挑戦した日など色々な使い方ができると思います。
トータルスコア以外にもデータを保存したい場合は、キーを変えることで複数のデータを保存することもできます。
例えば、トータルスコアに加えて、このようにユーザー名を読み書きすることもできます。
読み出し時 val userName = prefs.getString(“KEY_NAME”, “名無しさん”)
書き込み時 editor.putString(“KEY_NAME”, userName)
ぜひ工夫して使ってみてください。
5. アプリの実行
ここでアプリを実行してみてください。
正解数が ResultActivity に渡されて、結果画面に正しく表示されたでしょうか?
「もどる」ボタンについて
「もどる」ボタンはスタート画面を作成した後に実装します。(講座完全版でお読みいただけます。)
クイズ画面に戻るには以下のコードを追加してください。
override fun onCreate(savedInstanceState: Bundle?) {
/* 省略 */
// もどるボタン
binding.returnBtn.setOnClickListener {
startActivity(Intent(this@ResultActivity, MainActivity::class.java))
}
}
完成
お疲れ様でした、これで完成です!
「アプリ開発って意外と簡単だな」と感じて頂けていれば嬉しい限りです。
クイズ内容は自由にアレンジして構わないので、ぜひオリジナルのアプリを作ってみてくださいね。
【サンプルコード】Kotlinでつくるクイズアプリ講座
この講座の完全版では、さらにクイズアプリ開発を学ぶことができます。
受講期限なし、個別サポートあり、今すぐに始めることができます!
- クイズのカテゴリ別に出題する方法
- SQLite データベースを使った実装
- 効果音の再生
- 画像を使ったクイズアプリ
- 答えを入力するクイズアプリ
超初心者です。
とてもわかりやすく助かっています、ありがとうございます。
最終章までわりとスムーズにできましたが、最後エラーがでてしまい、完成できずにいます。
ResultActivity.itの、正解数を取得の0)あとに赤い波線がでて、その後の、TextViewに表示するの、bindingと最後のscoreが赤くなり、..=,に赤い波線が出てしまいます。
エラーメッセージ
Expecting””
Unresolved reference:binding
Expecting an element
Expecting an element
Expecting an element
Expecting’)’
Unresolved reference:score,
またMainActivityの結果画面を表示の2段目のintentが赤くなってしまいます。
エラーメッセージ
Unresolved reference:intent
Windows11Home
AndroidStudio2022.1.1
を使っています。
自分では入力や綴りの再確認をしましたが、解決できませんでした。
よろしくお願いします。
当サイトを見つけていただきありがとうございます!
コードに間違いが無い場合、Android Studio のキャッシュや同期処理が上手く行っていないことが考えられるので、Android Studio の再起動をお試しください。
再起動でも解決しない場合は、エラー部分のスクリーンショットを貼り付けて頂けばと思います。
お返事ありがとうございます。
もう一回よく確認していたら入力間違いがあったのと、再起動をしたらエラーが消えました。
ありがとうございました!
ご報告ありがとうございます。
解決したとのこと良かったです!