我处于以下场景:
我有一个包含 ViewModel
的 OnboardActivity
,我可以多次旋转这个 OnboardActivity
和 ViewModel
跨配置更改持续存在而不会出现问题。
但是,如果我使用 startActivityForResult(...)
在这个 (OnboardActivity
) 之上启动另一个 Activity(FirebaseAuthActivity)
,然后在 FirebaseAuthActivity
中旋转设备并按下后退按钮。当 OnboardActivity
被带到堆栈的顶部时,它会再次重新创建 ViewModel
实例。
这是 ViewModel
在架构组件中的正常行为吗?
当 OnboardActivity
从堆栈中弹出且屏幕方向不同于保存时的屏幕方向时,有没有一种方法可以告诉它不完成?
最佳答案
我已经回答过类似的问题here , 这可能会帮助您现在修复自己。
这是来自 android 框架的错误。 Bug details
修复在 28.0.0-alpha3 和 AndroidX 1.0.0-alpha3 中可用
但是如果你不想自己更新到以上版本,那么你可以这样解决(我知道这是一个不好的解决方案,但我没有看到任何其他好的方法)
在调用 super.onDestroy 之前,在您的 Activity 中覆盖 onDestroy 方法并将所有必需字段保存到局部变量。现在调用 super.onDestroy 然后再次初始化您的 ViewModel 并将所需的字段分配回您的新 ViewModel 实例
以下代码是 Kotlin 语言:
override fun onDestroy() {
if (!isFinishing) { //isFinishing will be false in case of orientation change
val oldViewModel = obtainViewModel()
val requiredFieldValue = oldViewModel.getRequiredFieldValue()
super.onDestroy
val newViewModel = obtainViewModel()
if (newViewModel != oldViewModel) { //View Model has been destroyed
newViewModel.setRequiredFieldValue(requiredFieldValue)
}
} else {
super.onDestroy
}
}
private fun obtainViewModel(): SampleViewModel {
return ViewModelProviders.of(this).get(SampleViewModel::class.java)
}
关于当其主机 Activity 不在 Activity 堆栈的顶部并且设备旋转时,Android ViewModel 重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48200085/