当第二个活动方向改变时,registerForActivityResult 不起作用

问题描述 投票:0回答:3

我使用

ActivityResultLauncher
从活动 A 调用活动 B,并在任务完成时设置活动 B 的结果。如果方向不改变,这将非常有效。问题是当我从活动 B 更改方向然后设置结果时,则不会调用活动 A 的
registerForActivityResult
。有人可以告诉我,可能是什么问题吗?

注意:如果我使用

startActivityForResult
onActivityResult
,我不会遇到此问题。我将其更改为
ActivityResultLauncher
,因为
startActivityForResult
已被 弃用

活动示例代码:

private lateinit var launcher: ActivityResultLauncher<Intent>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(layout)
    setLauncherResult()
}

private fun setLauncherResult() {
    launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) {
            //Do operations here
        }
}

 //On button click starting activity B using launcher
 val intent = Intent(activityA, activityB)
 launcher.launch(intent)

}

活动B示例代码:

//setting result
val intent = Intent()
//set intent extras
setResult(Activity.RESULT_OK, intent)
finish()
android kotlin android-intent kotlin-android-extensions startactivityforresult
3个回答
0
投票

您可以将值保存在

onSaveInstanceState()
中并在
onRestoreInstanceState()
中使用setResult。


0
投票

尝试将

registerForActivityResult
launcher
分配移至
onCreateView()
(如果尚未覆盖,请覆盖它)。把它放在这里,我没有得到
RuntimeException
中的“正在尝试在当前状态已启动时注册”
OnCreateView()
,就像使用
onResume()
或更高版本一样。
OnCreateView()
相对于
OnCreate()
的优点似乎是
launcher
变量将在主题日/夜变化以及方向变化时重新设置。

另请参阅配置更改和进程死亡部分此处了解更多讨论。

我知道官方 dox 说在课堂上的其他任何内容之前设置它是安全的,但是主题更改打破了

.launch()
,这个位置似乎对我有用。


-1
投票

每次方向改变时,它都会调用

onCreate
并重置您的视图,并重新分配
launcher
等其他变量。因此,您可以按照官方文档中显示的示例进行操作:https://developer.android.com/training/basics/intents/result#launch

然后将您的

launcher
作业从
onCreate
中取出,如下所示(这对我有用):

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding


    private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) {
            //do your stuff here
            binding.tv.text = result.data?.getStringExtra("text")
        }
    }


    companion object {
        var number : Int = 0
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.tv.setOnClickListener {
            val intent = Intent(this, ActivityB::class.java)
            startForResult.launch(intent)
        }
    }
}

如果您不希望在方向改变时再次调用

onCreate
。然后在你的清单中你可以添加
configChanges
:

<activity android:name=".MainActivity"
            android:configChanges="orientation|screenSize">
© www.soinside.com 2019 - 2024. All rights reserved.