Skip to main content

Activity Result APIを使ってカスタムコントラクトを作成する

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

関連記事:

Pocket