作って学べる
プログラミング講座
アプリを作りながら学習
自分のペースですぐに始められる
困ったら何回でも質問可能
4択クイズアプリ(Kotlin)

【Android Studio】Kotlinでつくるクイズアプリ講座 第7回「結果の表示」

Sara

Android Studio Hedgehog | 2023.1.1 での動作確認を完了しました。(2024年1月)

ここまでの記事はこちら

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

ここでは intent(インテント)と SharedPreferences(シェアードプレファレンシズ)というものを使います。

どちらもアプリ開発でよく使われるので、いつでもサクッと実装できるように覚えておくと便利だと思います。

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

解説

1. View Binding の用意

クイズ画面と同じく ViewBinding を使えるようにします。

ResultActivity.kt を開いて9・13・14行目を追加します。

2. 正解数を ResultActivity に渡す

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

MainActivity.kt の checkQuizCount 関数に4~6行目を追加してください。

必要なimport

3行目あたりに import が追加されます。

import android.content.Intent

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 を紹介します。

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

見やすいように順番を変えてコメントも書きましたが、新たに追加したコードは 10・11・14・18・21~23 行目です。

10行目:SharedPreferences の準備

まずは SharedPreferences を使うための準備です。

val prefs = getPreferences(Context.MODE_PRIVATE)

getPreferences(モード)のように書きます。

MODE_PRIVATE は「このアプリからのみ」アクセスできるモードです。

モードにはいくつか種類がありましたが、現在推奨されていないものが多いので MODE_PRIVATE を使うと覚えておけば問題ありません。

補足
getPreference メソッドで保存した値は、1つのアクティビティでのみ有効になります。ですので、トータルスコアはクイズ画面(MainActivity)で呼び出すことはできません。
複数のアクティビティで保存した値を扱う場合は getSharedPreferences(“ファイル名”, モード) と書きます。

11行目:トータルスコアを取り出す

var totalScore = prefs.getInt("TOTAL_SCORE", 0)

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

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

トータルスコアはあとでスコアを加算するので、var にしています。

18行目:トータルスコアを表示する

binding.totalScoreLabel.text = getString(R.string.result_total_score, totalScore)

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

21~23行目:トータルスコアを保存する

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))
        }
    }

完成

お疲れ様でした、これで完成です!

「アプリ開発って意外と簡単だな」と感じて頂けていれば嬉しい限りです。

クイズ内容は自由にアレンジして構わないので、ぜひオリジナルのアプリを作ってみてくださいね。

もっとクイズアプリ開発を学ぶ!

\ COURSE /
講座の完全版

ここまででもクイズアプリとしては十分に機能しますが「もっとアプリ開発をしてみたい!自分のアプリをリリースしたい!」という方のために、この講座の完全版をご用意しました。 

完全版では

    • SQLite データベースにクイズデータを保存する方法
    • データベースの中身を確認する方法
    • カテゴリ別のクイズ出題
    • 正解・不正解音の再生
    • Image Asset Studio(アイコン作成ツール)の使い方
    • AdMob バナー・インタースティシャル広告の実装
    • Google Play Store にアプリを公開する方法

を学ぶことができます。

Google Play Store へのアプリの公開方法・更新方法も紹介しているので、講座を進めながらアプリを全世界に公開することができます。

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

もう一歩先に進んでみたい!アプリを公開したい!という方はぜひご参加お待ちしています。

Subscribe
Notify of
guest
4 Comments
古い順
新しい順 人気順
Inline Feedbacks
View all comments
元山あいり
元山あいり
1 year ago

超初心者です。
とてもわかりやすく助かっています、ありがとうございます。
最終章までわりとスムーズにできましたが、最後エラーがでてしまい、完成できずにいます。
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
を使っています。
自分では入力や綴りの再確認をしましたが、解決できませんでした。
よろしくお願いします。

元山あいり
元山あいり
1 year ago
Reply to  Sara

お返事ありがとうございます。
もう一回よく確認していたら入力間違いがあったのと、再起動をしたらエラーが消えました。
ありがとうございました!

ABOUT ME
Sara
書籍やオンライン講座でプログラミングを勉強してフリーランスのプログラマーになりました。
このサイトでは「わかりやすく・シンプル」をモットーに、プログラミングの基礎からアプリ開発まで紹介します。
独学でプログラミングを勉強をしている方、基礎は勉強したけれど次に何をすれば良いか分からない...という方のお役に立てるサイトを目指しています。
主な使用言語:Java / Kotlin / PHP
>> 詳しいプロフィールはこちら
>> 書籍を出版しました!
>> お問い合わせはこちら
本格的に学びたい方へ

Code for Fun プログラミング講座

Code for Fun プログラミング講座では、プログラミングの基礎からアプリ開発まで学ぶことができます。

わかりやすく・シンプルをモットーに

  • 同じコードを書けば必ず完成できること
  • 専門用語を使いすぎないこと

を重視しています。

POINT 01

動くコード

プログラミングの文法だけを学んでも、そこから動くアプリを開発をするのは難しいです。

Code for Fun のプログラミング講座では、ゲームやカレンダーなど「アプリとして機能するもの」を作りながらプログラミングを学ぶことができます。

POINT 02

自分のペースで

オンライン講座なので、ご自身のペースで学習を進めて頂けます。

分からないことがあっても、前のレッスンに戻ることができるので安心です。

お申し込みしたその日からからすぐに始めることができます。

POINT 03

個別サポート

プログラミング学習では、エラーが起きることはよくあります。そんな時はお気軽にお問い合わせください!

コメント欄またはメールによるサポートを回数無制限でご利用頂けます。(*講座に関連するご質問のみ対応)

今すぐ無料でお試し

4
0
この記事にコメントするx
記事URLをコピーしました