[Android & Kotlin ] アプリの画面遷移とActivity間のデータ転送

KotlinでのActivityの遷移とそれに伴ってデータを別Activityに送る、またそのActivityから何かのデータを受け取る方法について調べてみました。
 
intent 01 - [Android & Kotlin ] アプリの画面遷移とActivity間のデータ転送

Android Studio 4.1.3
API 30

000000047128 - [Android & Kotlin ] アプリの画面遷移とActivity間のデータ転送impression?a id=2545324&p id=969&pc id=1263&pl id=47128 - [Android & Kotlin ] アプリの画面遷移とActivity間のデータ転送 R904D.E24336V - [Android & Kotlin ] アプリの画面遷移とActivity間のデータ転送

Activity 画面を遷移しデータを受け渡すアプリ

 
画面遷移だけのKotlinのケースは、
 

Kotlinを使ってJavaと同じようにActivity間を遷移させる方法です。また同じActivity内で画面を変える方法もあります。 ...

 
にて説明しましたが、

  1. 遷移したタイミングでデータを渡したい
  2. 遷移先から戻るタイミングでデータを受け取りたい

という場合にはIntentを使ってActivity間でデータを渡すことができます。

  • startActivityForResult(Intent, int)
  • onActivityResult(int, int, Intent)

これらを使います。
 

 

MainActivity: putExtra & onActivityResult

 
MainActivity から SubActivity への遷移は

 
別の Activity を開始する ではpublicなKeyを設定しています。これはputExtraによると

String: The name of the extra data, with package prefix.

とありますので、例えばpackage名をprefix(com.example.testactivitytransdata)としてEXTRA_MESSAGEというのを設定します。
 

 
このEXTRA_MESSAGEを使って putExtra(name, value) に渡すデータの key(name) と value を入れます
入れるデータの型指定はありません

 
data を渡すだけならこれでいいのですが、SubActivity からの返しを受け取りたいので
判別するためにrequestCodeも startActivityForResult() に渡します。

onActivityResult() で受け取り、返ってくる結果が正常か、またリクエストコードの判定をします。

 

 

SubActivity: データを受け取る

 
渡されたデータを受け取るときには、型に合わせてgetString()などを使います

 

name とデータの型を指定します。
データが int の場合は、初期値を入れますがString型ではいりません。
その他、
getBooleanExtra(String name, boolean defaultValue)
…etc.
Intent reference

 

SubActivity: [back] ボタンタップで元に戻り、データを返す

 
SubActivity から戻るときにデータを返すには同様に
putExtra(name, value)
を使います
 

 

MainActivity: 元の画面でデータを受け取る

 
SubActivity からのデータを受け取るにはonActivityResult 内で受け取ります
この受け取りでは、MainActivity は onCreate() から始まらずに Life Cycle での挙動で onActivityResult に到達します
 

 
色々追加して、以下のような機能でまとめてみます。
MainActivityで文字入力
SubActivityで受け取って表示
SubActivityから、受け取った文字列に追加して戻す
MainActivityではSubActivityから戻された文字列を表示
 
MainActivity.kt

 
遷移先のActivity
SubActivity.ktを作成しコードを記述します。

SubActivity.kt

 
MainActivityのレイアウトです。作りやすさでLinearLayoutを選んでますがデフォルトの constraintlayout ではないので注意してください。

activity_main.xml

 

SubActivityのレイアウト
activity_sub.xml

 
リソースです

strings.xml

Manifest に SubActivity の記述も忘れずに、package名は適宜合わせてください。
AndroidManifest.xml

 
View Binding の設定
build.gradle

 

 

 
References:
Activity | Android Developers
別の Activity を開始する | Android Developers
Intent | Android Developers