我在以下场景中:
我有一个包含viewmodel的OnboardActivity,我可以多次旋转这个OnboardActivity,并且viewmodel可以在没有问题的情况下保持配置更改.
但是,如果我使用startActivityForResult(…)在此(OnboardActivity)之上启动另一个Activity(FirebaseAuthActivity),然后在FirebaseAuthActivity中我旋转设备并按后退按钮.当OnboardActivity被带到堆栈顶部时,它会再次重新创建viewmodel实例.
这是viewmodel在架构组件中的正常行为吗?
有没有办法告诉OnboardActivity从堆栈弹出时屏幕方向与保存的屏幕方向不同?
最佳答案
我已经回答了类似的问题here,这可能会帮助你解决现在的问题.
原文链接:https://www.f2er.com/android/430187.html这是一个来自android框架的bug. Bug details
该修复程序在28.0.0-alpha3和AndroidX 1.0.0-alpha3中可用
但是,如果您现在不想更新到上面的版本,那么您可以这样解决(我知道这是一个糟糕的解决方案,但我没有看到任何其他好方法)
在您的活动中重写onDestroy方法并在调用super.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)
}