🍏
[Kotlin]Activityで結果を取得(Activity Result API)
経緯
Activityからの結果取得で、知らぬ間にonActivityResultが非推奨になっていたので。
これまでの方法
呼び出す側
FirstActivity
binding.sampleButton.setOnClickListener {
startActivityForResult(SecondActivity.createIntent(this), REQUEST_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (resultCode) {
Activity.RESULT_OK -> {
data?.let { data ->
val value = data.getIntExtra(SecondActivity.KEY_VALUE, 0)
println($value)
}
}
}
}
呼び出され結果を返す側
SecondActivity
binding.backButton.setOnClickListener {
val intent = Intent().apply { putExtra(KEY_VALUE, 999) }
setResult(Activity.RESULT_OK, intent)
finish()
}
companion object {
const val KEY_VALUE = "key_value"
}
これをActivity Result APIに置き換える
gradle設定
dependencies {
def activity_version = "1.4.0"
def fragment_version = "1.4.1"
// Activity
implementation "androidx.activity:activity-ktx:$activity_version"
// Fragment
implementation "androidx.fragment:fragment-ktx:$fragment_version"
}
呼び出す側
FirstActivity
private val launcher: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { value ->
println($value)
}
binding.sampleButton.setOnClickListener {
launcher.launch(SecondActivity.createIntent(this))
}
呼び出され結果を返す側(SecondActivity)は特に変更無し。
Permissionについて
個人的にはrequestPermissionの実装ではActivity Result APIだと不便と感じた記憶が。
そこら辺も後々記事にして理解深めます。
Discussion