[英]registerForActivityResult not working when second activity orientation changes
我正在使用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。
尝试将launcher
的registerForActivityResult
分配移动到onCreateView()
(如果你还没有覆盖它)。 把它放在这里,我没有得到“正在尝试注册,而当前 state 已启动”在OnCreateView()
中的RuntimeException
与onResume()
或更高版本一样。 OnCreateView()
优于OnCreate()
的优势似乎是launcher
变量将在主题日/夜变化以及方向变化时重新设置。
另请参阅此处的配置更改和进程死亡部分以获取更多讨论。
我知道官方 dox说在 class 中的任何其他内容之前设置它是安全的,但是主题更改破坏了.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">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.