【Kotlin】startActivityForResultの使い方【Androidアプリ開発】
今までActivity間の画面遷移におけるデータの受け渡しは、シングルトンやPreferenceなどでパターンでやっていたが、簡単なものならstartActivityForResultを使えば便利そうだ。ここでは単純なモデルで、startActivityForResultを使ったデータの受け渡しの動作確認をしていこう。
仕様
MainActivityとSubActivityを作って遷移させる。
SubActivityからメッセージを受け取って、MainActivityのTextViewへ反映させるといったシンプルなものだ。また、端末の戻るボタンで戻った場合は、違うメッセージを表示させる。
MainActivity
それでは、MainActivityから見ていこう。
kotlin
startActivityForResult(intent, 9) では、AcrequestCodeに値をセットすることで、Activityごとに処理を分けることができる。onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) は、戻ったときにコールバックされるメソッドだ。ここでは、resultCodeでActivityを識別して、Intentからデータを取り出している。また、Activity.RESULT_CANCELEDの場合は、端末の戻るボタンが押されたものと判断させている。class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val show = findViewById<Button>(R.id.show)
show.setOnClickListener {
val intent = Intent(this, SubActivity::class.java)
startActivityForResult(intent, 9) // AcrequestCodeで複数Activityに対応できる
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode != 9) { return }
val result = findViewById<TextView>(R.id.result)
if (resultCode == Activity.RESULT_OK && data != null) {
val message = data.getStringExtra("message")
result.text = message
} else if(resultCode == Activity.RESULT_CANCELED) {
result.text = "端末の戻るボタンが押されました。"
}
}
}
SubActivity
次に、遷移先であるSubActivityを見ていこう。
kotlin
setResult(Activity.RESULT_CANCELED)であらかじめキャンセル指定している。最初にキャンセルされた結果をセットしておくことで、端末の戻るボタンでRESULT_CANCELEDが認識されるようにしている。しかし、デフォルトでRESULT_CANCELEDが設定されているようなので、この記述はなくても良いのかもしれない。setResult(Activity.RESULT_OK, Intent)では、渡したいデータをIntentを使ってセットしている。この場合、キーを"message"とし、値に "Hello! I'm from SubActivity!⛄️" をセットしている。以上のプログラムで、最初の図の画面結果が得られる。class SubActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sub)
// 最初にキャンセルされた結果をセットしておくことで、端末の戻るボタンに対応させる
setResult(Activity.RESULT_CANCELED) // 無くても動く?
val close = findViewById<Button>(R.id.close)
close.setOnClickListener {
val result = Intent()
result.putExtra("message", "Hello! I'm from SubActivity!⛄️")
setResult(Activity.RESULT_OK, result)
finish()
}
}
}
Intentの役割
コンポーネントは、他のコンポーネントを呼び出すことができる。そのときに、情報をメッセージとしてAndroidシステムに渡す仕組みをIntentと呼ぶ。ここでのコンポーネントとは、アクティビティやサービスである。つまり、ActivityからActivityへ直接値を渡しているわけではない。AndroidシステムへIntentを投げて、それに適合したActivityが呼び出されるといったイメージだ。
▼ こんな記事も書いてます。
関連記事
アイデアノート > ネイティブアプリ開発