Android Studio + kotlin + SQLiteで音符フラッシュカードアプリを作る ⑥トップ画面から引き継いだデータ表示(インテント(getExtra))


1.今回のテーマ

前回はトップ画面からゲーム画面にデータを引き渡す方法を解説しました。
今回はデータを渡された側のゲーム画面で、どのようにデータを取得して利用するかを説明します。

2.前回の復習 ~データの渡し方

androidで別画面にデータを渡すには、以下のステップが必要でした。
①Intentクラスのインスタンスを生成する。
②起動先アクティビティに渡すデータを格納する。
③アクティビティを起動する。
実際のコードは以下の通りです。

MainActivity.kt
        override fun onClick(view: View) {

            //ゲーム画面へのインテントを準備・・・①
            val intent2Game = Intent(this@MainActivity, GameActivity::class.java)

            //押されたレベルボタンからタグを取得して、インテントにセット・・・②
            val level = view.tag.toString()
            intent2Game.putExtra("level", level)

            //ゲーム画面に遷移(渡すのはレベルのみ)・・・③
            startActivity(intent2Game)
        }

データを渡す際は、putExtra()メソッドを使って、データ名を指定して渡してあげました。

intent2Game.putExtra("level", level)

3.遷移先画面(アクティビティ)の作成

まずは遷移先のアクティビティを新規で作成します。

android studioのオブジェクトエクスプローラーを表示させて、appで右クリック⇒新規⇒アクティビティ⇒空のアクティビティ
を選択します。

すると以下の画面が表示されるので、アクティビティ名を入力します。

今回はGameActivityとしました。
これがkotlinのファイル名になります。
また、アクティビティ名を入れると、自動でレイアウト名が設定されます。
これがxmlファイルの名前になります。
kotlinとxmlは紐づけがわかりやすいほうが良いので、よほどのこだわりがなければ自動設定されたままで良いと思います。
今回は自動でactivity_gameが設定されました。

この状態で「完了」ボタンを押すと、
・GameActivity.kt
・activity_game.xml
の二つのファイルが生成されます。

また、AndroidManifest.xmlファイル内にもandroid studioが自動でアクティビティを追加してくれます。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.websarva.wings.android.musicnotecardquiz">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".ResultActivity"></activity>
        <activity android:name=".GameActivity" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

<activity android:name=".GameActivity" />
の部分です。

4.データの取得

それでは、作成したGameActivity.ktに、トップ画面から渡されたデータを取得する処理を書いていきます。
アクティビティ開始時点で呼ばれる処理になるので、onCreate()メソッド内に書いていきます。最初の2行は自動で生成されるままで特に修正不要です。

GameActivity.kt
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)

        //インテントからレベルを取得
        val level = intent.getStringExtra("level")

データを渡す際は、putExtra()メソッドを使いましたが、データを取得する際はgetXXXExtra()メソッドを使います。

XXXの部分は、渡されたデータ型に応じて変わります。
今回は、文字列データを渡しているので、getStringExtra()を使用します。

引数は、putExtra()をする際に指定したデータの名称です。

今回は、

            intent2Game.putExtra("level", level)

と、"level"というデータ名称で渡しているので、取得する際もこの"level"を指定します。
この1行だけで取得完了です。
左辺のlevelという変数に取得したデータが格納されました。

ちなみに、数値型で渡されたデータを取得する際は、getIntExtra()
Boolean型で渡されたデータを取得する際は、getBooleanExtra()
です。
getStringExtra()の場合は初期値不要ですが、getIntExtra(), getBooleanExtra()の場合は初期値を定義する必要があります。

5.取得したデータを画面に表示する

続いて、getStringExtraで取得したデータを画面に表示していきます。
手順としては、
①データを設定したい画面部品を取得
②取得した部品にデータをセット
です。

トップ画面で選択したレベルを表示させたい箇所は以下。

ちょっと小さくて見えづらいですが、
idはtvLevelです。

コードは以下の通り。先ほどのgetStringExtra()の直後に記述していきます。

GameActivity.kt

        //レベル表示
        var tvLevel = findViewById<TextView>(R.id.tvLevel) //①データを設定したい画面部品を取得
        tvLevel.setText(level) //②取得した部品にデータをセット

①データを設定したい画面部品を取得
⇒前回の復習です。画面部品を取得したい場合は、findViewById()です。
引数には、xmlで定義したid:tvLevelを指定します。

②取得した部品にデータをセット
⇒①で取得した部品のtext属性に値を設定していきます。
 text属性に値をセットするには、setText()メソッドを使います。
 引数は、getStringExtra()で取得したlevelを指定します。

以上で、引き継いだデータを取得して遷移先画面で表示することができました。

今回は以上です。

次回は同じくゲーム画面で、問題を出題する処理を書いていきます。

①概要
②画面デザイン~トップ画面(Constraint Layout)~
③画面デザイン~ゲーム画面(Linear Layout)~
④画面デザイン~結果画面(Linear Layoutその2)~
⑤トップ画面からの遷移(インテント(putExtra))
⑥トップ画面から引き継いだデータ表示(インテント(getExtra))(本記事)
⑦問題出題(ロジック実装)
⑧回答ボタン押下(効果音再生(MediaPlayer、正誤判定、次の問題出題)
⑨タイムカウンターの実装(handler)
⑩ゲーム画面から引き継いだゲーム結果表示(インテント)
⑪当日日付データ取得
⑫DB保存(SQLite、Insert)
⑬もう一度、トップ画面へ戻るボタン(インテント)
⑭ランキング表示(SQLite、Select)
⑮実機でのテスト
⑯Google Playで公開