Android ViewModel在其主机活动不在活动堆栈顶部且设备已旋转时重新创建

前端之家收集整理的这篇文章主要介绍了Android ViewModel在其主机活动不在活动堆栈顶部且设备已旋转时重新创建前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在以下场景中:

我有一个包含viewmodel的OnboardActivity,我可以多次旋转这个OnboardActivity,并且viewmodel可以在没有问题的情况下保持配置更改.
但是,如果我使用startActivityForResult(…)在此(OnboardActivity)之上启动另一个Activity(FirebaseAuthActivity),然后在FirebaseAuthActivity中我旋转设备并按后退按钮.当OnboardActivity被带到堆栈顶部时,它会再次重新创建viewmodel实例.

这是viewmodel在架构组件中的正常行为吗?

有没有办法告诉OnboardActivity从堆栈弹出时屏幕方向与保存的屏幕方向不同?

最佳答案
我已经回答了类似的问题here,这可能会帮助你解决现在的问题.

这是一个来自android框架的bug. Bug details

该修复程序在28.0.0-alpha3和AndroidX 1.0.0-alpha3中可用

但是,如果您现在不想更新到上面的版本,那么您可以这样解决(我知道这是一个糟糕的解决方案,但我没有看到任何其他好方法)

在您的活动中重写onDestroy方法并在调用super.onDestroy之前将所有必需字段保存到局部变量.现在调用super.onDestroy,然后再次初始化viewmodel,并将所需的字段分配回viewmodel的新实例

大约isFinishing

下面的代码在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)
}
原文链接:https://www.f2er.com/android/430187.html

猜你在找的Android相关文章