Activity
から戻ってくる際にその結果を受け取る必要がある場合のやりかた。
こういうネタ何書いても今さら感しかないわけだけど、しかし作っているもの的にこれまであまり必要なシーンも無かったので、備忘。
1. 結果を返すActivityの呼び方
startActivity(intent)
の代わりにstartActivityForResult(intent: Intent, requestCode: Int)
を使用する。
startActivityForResult(intent, HogeActivity.REQUEST_CODE)
requestCode
はInt型だが16bit範囲内の値である必要がある1。
これを守らないとIllegalArgumentException
投げられる。
定数値以外を使う場合0xffffでマスクするなりしてナントカする。
Fragmentから呼んで、返ってきた結果をActivityで処理する場合
Fragment.startActivityForResult(...)
を使用するとActivity.onActivityResult(...)
に渡されるrequestCode
が意図しないものになる。
以下のどちらかで対応。
Activity
で結果を受け取りたいならactivity?.startActivityForResult(...)
とかに書き換える。Fragment.onActivityResult(...)
で受け取る。
2. Activityから結果を返して終了する
Activity.finish()
を呼ぶ前にresultCode
と結果を返すためのIntent
をセットする。
val intent = Intent().apply {
putExtra(RESULT_DATA, result)
}
setResult(Activity.RESULT_OK, intent)
finish()
成功ならActivity.RESULT_OK
、失敗ならActivity.RESULT_CANCELED
があるのでそれを使えばそれで良い気がする。
何も指定しないとActivity.RESULT_CANCELED
が返ってくるっぽい。
3. 返ってきた結果を受け取る
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
HogeActivity.REQUEST_CODE -> {
when (resultCode) {
Activity.RESULT_OK -> {
val result = data?.getSerializableExtra(HogeActivity.RESULT_DATA) as? HogeResult
...
}
Activity.RESULT_CANCELED -> {
...
}
}
}
}
}
この辺もう少し簡潔に書くための試みが色々あるようだけど今回はこれで十分な規模だったので割愛。
必要になったら調べる。