web-dev-qa-db-ja.com

startActivityForResultをActivity Result APIに置き換える方法は?

状況に応じて、さまざまなアクティビティを呼び出すエントリポイントとして機能するメインアクティビティがあります。特に、Firebase Authを使用してユーザーのサインインを管理しています。

_startActivityForResult(
            AuthUI.getInstance().createSignInIntentBuilder()
                    .setAvailableProviders(providers)
                    .build(),
            RC_SIGN_IN)
_

返されたインテント/データを区別するためにonActivityResult()を上書きします。次に例を示します。

_ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {

        REQUEST_CODE_1 -> {
          // update UI and stuff
        }

        RC_SIGN_IN -> {
          // check Firebase log in
        }
        // ...
    }
}
_

documentation で強く推奨されているアクティビティ結果APIでは、ActivityResultLauncherの前にprepareCall()を作成し、アクティビティが作成済み状態であることを確認する必要があります起動しても、複数のアクティビティの結果をonActivityResult()のように(少なくとも1か所で)正常に処理する方法がわかりません。

この記事 を見ると、ActivityResultContract型の子内部クラスmultipleを実装する必要があるようです(したがって、複数のprepareCall() 's?)、それらは異なるcontractsであると想定されるため、私は正しいですか?上記のonActivityResult()ロジックを反映したスケルトンの例を誰かに見せてもらえますか?

3
Neoh

この場合、AuthUIによって返されたものはすでにインテントだったので、以下の例のように使用します。

private val startForResult =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            when(result.resultCode){
                RESULT_OK -> {
                    val intent = result.data
                    // Handle the Intent...
                    mUser = FirebaseAuth.getInstance().currentUser
                }
                RESULT_CANCELED -> {

                } else -> {
            } }
        }

以下を使用して、どこからでも(ボタンのクリックなどで)アクティビティを開始します。

 AuthUI.getInstance().createSignInIntentBuilder().setAvailableProviders(providers)
            .build().apply {
                startForResult.launch(this)
            }
1
nyxee

結果のアクティビティは必要な数だけ呼び出すことができ、それぞれに個別のコールバックがあります。

    val startForResult = prepareCall(ActivityResultContracts.StartActivityForResult())
    { result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) {
            //  you will get result here in result.data
            }

        }
    }

    startForResult(Intent(activity, CameraCaptureActivity::class.Java))

アクティビティクラスを指定するだけです-CameraCaptureActivity::class.Java

0
Misha Akopov