Android 片段中的ViewModel清除屏幕旋转时的值

Android 片段中的ViewModel清除屏幕旋转时的值,android,android-fragments,viewmodel,android-architecture-components,android-livedata,Android,Android Fragments,Viewmodel,Android Architecture Components,Android Livedata,我想我错过了一些明显的东西但是。。。我将数据存储在uiModel的DiaryViewModel类中,由于我使用了架构组件,我希望通过屏幕旋转来保留数据,但事实并非如此。我不知道为什么 这是一块剥落的碎片 class DiaryFragment: Fragment() { private lateinit var viewModel: DiaryViewModel override onCreateView(...) { viewModel = ViewModel

我想我错过了一些明显的东西但是。。。我将数据存储在
uiModel
DiaryViewModel类中,由于我使用了架构组件,我希望通过屏幕旋转来保留数据,但事实并非如此。我不知道为什么

这是一块剥落的碎片

class DiaryFragment: Fragment() {
    private lateinit var viewModel: DiaryViewModel

    override onCreateView(...) {
        viewModel = ViewModelProviders.of(this).get(DiaryViewModel::class.java)
        viewModel.getModel().observe(this, Observer<DiaryUIModel> { uiModel ->
            render(uiModel)
        })
    }
}
class-DiaryFragment:Fragment(){
私有lateinit变量viewModel:DiaryViewModel
重写onCreateView(…){
viewModel=ViewModelProviders.of(this.get)(DiaryViewModel::class.java)
viewModel.getModel().observe(这个,观测者{uiModel->
渲染(uiModel)
})
}
}
以及相应的视图模型

class DiaryViewModel: ViewModel() {
    private var uiModel: MutableLiveData<DiaryUIModel>? = null

    fun getModel(): LiveData<DiaryUIModel> {
        if (uiModel == null) {
            uiModel = MutableLiveData<DiaryUIModel>()
            uiModel?.value = DiaryUIModel()
        }

        return uiModel as MutableLiveData<DiaryUIModel>
    }
}
class-DiaryViewModel:ViewModel(){
私有变量uiModel:MutableLiveData?=null
fun getModel():LiveData{
if(uiModel==null){
uiModel=MutableLiveData()
uiModel?.value=DiaryUIModel()
}
将uiModel作为MutableLiveData返回
}
}

有人能看到这个简单的例子中缺少了什么吗?现在,旋转屏幕时,
uiModel
设置为
null

问题在于活动如何处理片段创建MainActivity总是在每次旋转时创建一个新片段,如中所示

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    supportFragmentManager
        .beginTransaction()
        .replace(overlay.id, DiaryFragment.newInstance())
        .commit()
}
但当然,在检查是否保存了实例时,它的效果要好得多,如中所示

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if (savedInstanceState == null) {
        supportFragmentManager
            .beginTransaction()
            .replace(overlay.id, DiaryFragment.newInstance())
            .commit()
    }
}

您正在使用哪个版本的支持库?v26.1.0包括对
生命周期的支持(尽管不确定这是否是您看到的问题的原因)@JohnO'Reilly 27.0.2。我也读过,这可能是问题所在,但它在版本26中得到了修复。我想我面临的是不同的情况。这可能与片段的生命周期有关……不一定是解决方案本身,但我通常要做的是将
activity
传递到
ViewModelProviders.of()
,但您还需要检查这对您的特定用例是否有意义(如中所示)。我试过了,但没用,没什么区别。