猜猜我这里缺少明显的东西,但是...我将数据存储在 DiaryViewModel 类的uiModel
中,由于我使用的是体系结构组件,因此我希望通过屏幕旋转来保留数据-但是不会。我不知道为什么。
这是一个精简的 fragment
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)
})
}
}
以及相应的 View 模型。
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>
}
}
有人可以看到这个简单示例中缺少的内容吗?现在,旋转屏幕时
uiModel
设置为null
。 最佳答案
问题在于 Activity 如何处理 fragment 创建。 MainActivity 始终每次旋转创建一个新 fragment ,如
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()
}
}
关于android - fragment 中的ViewModel清除屏幕旋转时的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48150846/