Alg*_*gar 6 android viewmodel android-fragments android-livedata android-architecture-components
猜猜我缺少明显的东西在这里,但......我存储在数据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)
})
}
}
Run Code Online (Sandbox Code Playgroud)
和相应的视图模型.
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>
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都能看到这个简单例子中缺少的东西吗?现在,uiModel设置为null旋转屏幕时.
Alg*_*gar 14
问题在于活动如何处理片段创建.MainActivity总是在每次旋转时创建一个新片段,如
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager
.beginTransaction()
.replace(overlay.id, DiaryFragment.newInstance())
.commit()
}
Run Code Online (Sandbox Code Playgroud)
但是当然,在检查我们是否有一个已保存的实例时,它的效果会更好
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.replace(overlay.id, DiaryFragment.newInstance())
.commit()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3074 次 |
| 最近记录: |