Activity Result APIがstableになったので使ってみた
の続編
今度はカスタムコントラクトを作ってみた
・ActivityResultContracts
SecondActivity
class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_second) setSupportActionBar(findViewById(R.id.toolbar)) setResult(RESULT_OK, Intent().also { it.putExtra(EXTRA_KEY, "ikemen") }) } companion object { private const val EXTRA_KEY = "masterka" fun createIntent(context: Context): Intent { return Intent(context, SecondActivity::class.java) } } }
呼び出し側
private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> Toast.makeText(this, uri?.toString() ?: "empty", Toast.LENGTH_LONG).show() } //呼び出すところ val intent = SecondActivity.createIntent(this) getActivityResult.launch(intent)
・カスタムコントラクト
SecondActivityの中に以下を定義
class GetResult : ActivityResultContract<Unit, String?>() { override fun createIntent(context: Context, input: Unit?): Intent { return createIntent(context) } override fun parseResult(resultCode: Int, intent: Intent?): String? { return if (resultCode == Activity.RESULT_OK) { intent?.getStringExtra(EXTRA_KEY) } else { null } } }
呼び出し側
private val getContent2 = registerForActivityResult(SecondActivity.GetResult()) { Toast.makeText(this, it?.toString() ?: "empty", Toast.LENGTH_LONG).show() } getContent2.launch(Unit)
onActivityResultを撲滅できたのでコードだいぶ追いやすくなりました。
正直可読性だけならカスタマイズしなくても良いかなぁと思います
ただカスタマイズすれば型を固定できるので
さらにコードが追いやすくなるので、どこまでやるかですが検討しても良さそうです
参考
https://zenn.dev/t2low/articles/ea610398e29154e1a887
https://developer.android.com/training/basics/intents/result?hl=ja