ActivityResultRegistryは推奨されるアプローチです
ComponentActivity
今提供しActivityResultRegistry
、あなたが処理することができますそのstartActivityForResult()
+をonActivityResult()
だけでなく、requestPermissions()
+はonRequestPermissionsResult()
あなたのメソッドをオーバーライドすることなく、流れActivity
やFragment
、経由増加型の安全性をもたらしますActivityResultContract
、そしてこれらのフローをテストするためのフックを提供します。
AndroidX Activity 1.2.0-alpha02とFragment 1.3.0-alpha02で導入されたActivity Result APIを使用することを強くお勧めします。
これをあなたに追加 build.gradle
def activity_version = "1.2.0-alpha03"
// Java language implementation
implementation "androidx.activity:activity:$activity_version"
// Kotlin
implementation "androidx.activity:activity-ktx:$activity_version"
ビルド済みの契約をどのように使用しますか?
この新しいAPIには、次の事前構築された機能があります。
- TakeVideo
- PickContact
- GetContent
- GetContents
- OpenDocument
- OpenDocuments
- OpenDocumentTree
- CreateDocument
- ダイヤル
- 写真を撮る
- RequestPermission
- RequestPermissions
takePictureコントラクトを使用する例:
private val takePicture = prepareCall(ActivityResultContracts.TakePicture())
{ bitmap: Bitmap? ->
// Do something with the Bitmap, if present
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener { takePicture() }
}
ここで何が起こっているのでしょうか?少し分解してみましょう。takePicture
null可能なビットマップを返す単なるコールバックです。nullかどうかは、onActivityResult
プロセスが成功したかどうかによって異なります。prepareCall
その後、上の新しい機能に、このコール登録ComponentActivity
と呼ばれるActivityResultRegistry
私たちは、この後に戻ってくるだろうが- 。ActivityResultContracts.TakePicture()
は、Googleが私たちのために作成した組み込みヘルパーの1つであり、最終的に呼び出すtakePicture
と、以前と同じ方法で実際にインテントがトリガーされますActivity.startActivityForResult(intent, REQUEST_CODE)
。
カスタム契約を書く方法は?
Intを入力として受け取り、アクティビティを要求したStringを結果のインテントで返す単純なコントラクト。
class MyContract : ActivityResultContract<Int, String>() {
companion object {
const val ACTION = "com.myapp.action.MY_ACTION"
const val INPUT_INT = "input_int"
const val OUTPUT_STRING = "output_string"
}
override fun createIntent(input: Int): Intent {
return Intent(ACTION)
.apply { putExtra(INPUT_INT, input) }
}
override fun parseResult(resultCode: Int, intent: Intent?): String? {
return when (resultCode) {
Activity.RESULT_OK -> intent?.getStringExtra(OUTPUT_STRING)
else -> null
}
}
}
class MyActivity : AppCompatActivity() {
private val myActionCall = prepareCall(MyContract()) { result ->
Log.i("MyActivity", "Obtained result: $result")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
button.setOnClickListener {
myActionCall(500)
}
}
}
詳細については、この公式ドキュメントを確認してください。