6

我处于以下情况:

我有一个OnboardActivity包含一个ViewModel,我可以OnboardActivity多次轮换,并且ViewModel在配置更改中持续存在而不会出现问题。

但是,如果我在这个 ( )Activity(FirebaseAuthActivity)之上启动另一个,然后我旋转设备并按下后退按钮。当被带到堆栈顶部时,它会再次重新创建实例。OnboardActivitystartActivityForResult(...)FirebaseAuthActivityOnboardActivityViewModel

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

有没有一种方法可以告诉OnboardActivity当它从堆栈中弹出时,它的屏幕方向与保存的屏幕方向不同?

4

3 回答 3

2

我在这里回答了一个类似的问题,这可能会帮助你现在修复自己。

这是来自 android 框架的错误。错误详情

该修复适用于 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)
}
于 2018-07-23T09:32:58.890 回答
1

我在使用 ViewModel 并进行了一些研究时注意到了同样的问题,这是场景:

  • 1) 打开 ActivityA -gets ViewModel 参考:TestViewModel@e71fab8
  • 2) 旋转设备 - 获取 ViewModel 参考:TestViewModel@e71fab8
  • 3)打开ActivityB
  • 4) 旋转装置
  • 5)按回(完成活动B)
  • 6) Activity A 从堆栈返回 - 获取 ViewModel 并参考:TestViewModel@260072e

我用工厂和默认创建方法测试了两种 ViewModel:

  • ViewModelProviders.of(this).get(TestViewModel::class.java)
  • ViewModelProviders.of(this, factory).get(DashboardViewModel::class.java)

这两个活动都扩展了 AppCompatActivity 类。

它使用 arch 版本 1.1.1 和 1.1.0 进行了测试。

-

于 2018-03-24T12:07:38.327 回答
0

打开相机或图库以选择图像时,我也会发生这种情况。在相机/画廊中旋转屏幕并返回,并重新创建视图模型。

于 2018-06-01T14:58:47.320 回答