猜猜我错过了一些明显的东西,但是......我正在{strong> DiaryViewModel 类中将数据存储在uiModel
中,因为我使用架构组件我期待数据通过屏幕旋转保留 - 但它没有。我对原因视而不见。
这是一个精简的片段
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 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
。
答案 0 :(得分:12)
问题在于活动如何处理片段创建。 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()
}
}