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

时间:2018-01-08 13:01:40

标签: android android-fragments viewmodel android-architecture-components android-livedata

猜猜我错过了一些明显的东西,但是......我正在{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

1 个答案:

答案 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()
    }
}