Androidプログラミング

【Android】Kotlinで画面遷移時にデータ受け渡しする方法【Intent】

Androidの画面遷移記事のアイキャッチ画像 Android

Androidアプリにおける画面遷移の際に変数(値)を渡す方法をサンプルコード(Kotlin)とともに紹介します。KotlinでもJavaのときと同様にIntentを活用することで実装できます。

スポンサーリンク

画面遷移とデータ受け渡しのポイント

Androidの画面遷移ではIntentクラスがポイントとなります。

順序は以下の通り。

  1. Intentクラスをnewする
  2. 画面遷移先(これから起動するアクティビティ)に渡すデータを格納する(putExtra)
  3. アクティビティを起動する(startActivity)

この方法に関しては、JavaでもKotlinでも同じですね。

スポンサーリンク

サンプルコード(Kotlin)

以下のようなアプリを作成しました。

機能は、メインアクティビティで入力したテキストをサブアクティビティで受け取って表示する、です。

画面遷移アプリの動作の様子
左(メイン)で入力した文字が右(サブ)に受け渡されている

サブアクティビティにはメインに戻るためのボタンも配置されています。

GUIとソースコードの紐づけはView Bindingを使っています。方法は以下記事を参考にしてください。
(本記事の画面遷移の方法自体はfindViewByIdを使用していてもできます)

今はfindViewByIdではなく、View Bindingが推奨されているようです。

Manifestを編集する

サブアクティビティのファイル(xmlとKotlinのファイル)を作成して、コードを作成しても実はサブアクティビティを表示することはできません。

AndroidManifest.xmlにサブアクティビティの存在を認識させるために編集する必要があります。

AndroidManifest.xmlはアプリの実行に必要な設定が記されているファイルです。

以下追記をします。

<application>
    <!--  省略  -->
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <!--  省略  -->
    </activity>
    <!--  ★追記★  -->
    <activity
        android:name=".SubActivity" >
    </activity>
</application>

これでサブアクティビティを使う準備ができました。

MainActivity

XMLは以下の通り。
EditTextに入力された値をサブアクティビティに渡します。

<TextView
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ff0"
    android:text="Value to SubActivity:"/>
<EditText
    android:id="@+id/etInput"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<Button
    android:id="@+id/btGosub"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Go SubActivity"
    android:layout_gravity="center" />

Kotlinのコードは以下の通り。
画面遷移に関係するのはボタンクリックのリスナー(20行以降)です。

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //Binding関連
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        //ボタンのインスタンス
        val btnListener = BtnListener()
        //ボタンにリスナ追加
        binding.btGosub.setOnClickListener(btnListener)

    }

    //リスナクラス
    private inner class BtnListener:View.OnClickListener{

        override fun onClick(v: View) {

            val intent = Intent(this@MainActivity,SubActivity::class.java)

            // 渡す値をIntentに格納
            intent.putExtra("MainText", binding.etInput.text.toString())

            // サブアクティビティを起動
            startActivity(intent)
        }
    }
}

SubActivity

XMLは以下の通り。
メインアクティビティからの値はEditTextで受け取ります。

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#0f0"
    android:text="From MainActivity" />
<EditText
    android:id="@+id/etSub"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

<Space
    android:layout_width="wrap_content"
    android:layout_height="20pt"/>

<Button
    android:id="@+id/btBackMain"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="Back to MainActivity" />

Kotlinは以下の通り。
13行あたりでメインアクティビティからの要素を受け取っています。

class SubActivity :AppCompatActivity(){

    private lateinit var binding: ActivitySubBinding

    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        //Binding関連
        binding = ActivitySubBinding.inflate(layoutInflater)
        var view = binding.root
        setContentView(view)

        // Mainからの変数の受け取り
        val fromMain_text = intent.getStringExtra("MainText")
        // 受け取った変数をEditTextに代入
        binding.etSub.setText(fromMain_text)

        // ボタンのインスタンス
        val btnListener_sub = BtnListenersub()
        // ボタンにリスナを追加
        binding.btBackMain.setOnClickListener(btnListener_sub)
    }

    //ボタンのリスナクラス
    private inner class BtnListenersub:View.OnClickListener{
        private lateinit var binding: ActivitySubBinding

        override fun onClick(v: View) {
    // サブアクティビティを終了する
            finish()
        }
    }
}

アクティビティを終了する際は、finish()を使用します。

スポンサーリンク

まとめ

Intentを使って、渡したい要素を格納して、startActivity、というJavaと同じ方法でできます。

スマホの画面は狭いので、画面遷移を有効に活用したいですね。

本記事の発展版↓。遷移先画面から値を受け取る方法。

他Android記事。

コメント

タイトルとURLをコピーしました