我使用
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()
您可以将值保存在
onSaveInstanceState()
中并在onRestoreInstanceState()
中使用setResult。
尝试将
registerForActivityResult
的 launcher
分配移至 onCreateView()
(如果尚未覆盖,请覆盖它)。把它放在这里,我没有得到 RuntimeException
中的“正在尝试在当前状态已启动时注册”OnCreateView()
,就像使用 onResume()
或更高版本一样。 OnCreateView()
相对于 OnCreate()
的优点似乎是 launcher
变量将在主题日/夜变化以及方向变化时重新设置。
另请参阅配置更改和进程死亡部分此处了解更多讨论。
我知道官方 dox 说在课堂上的其他任何内容之前设置它是安全的,但是主题更改打破了
.launch()
,这个位置似乎对我有用。
每次方向改变时,它都会调用
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">