ViewModel 是 Android Architecture Components 的一部分,旨在以生命周期感知的方式存储和管理与 UI 相关的数据。它的主要目的是在配置更改(如屏幕旋转)时保持数据状态,避免数据丢失。
当从一个 Activity 或 Fragment 切换到另一个 Activity 或 Fragment 时,可能会遇到 ViewModel 数据丢失的问题。
确保在创建 ViewModel 时使用正确的 Scope。通常情况下,应该使用 ViewModelProvider.NewInstanceFactory()
来创建 ViewModel,并将其绑定到当前 Activity 或 Fragment 的生命周期。
class MyViewModel : ViewModel() {
// 数据存储
val data = MutableLiveData<String>()
}
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.data.observe(this, Observer {
// 更新 UI
})
}
}
如果需要在配置更改时保存 ViewModel 的状态,可以使用 SavedStateHandle
。
class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
val data = savedStateHandle.getLiveData<String>("data", "default_value")
fun updateData(newData: String) {
data.value = newData
}
}
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this, SavedStateViewModelFactory(getApplication(), this)).get(MyViewModel::class.java)
viewModel.data.observe(this, Observer {
// 更新 UI
})
}
}
确保在 XML 布局文件中正确绑定 ViewModel 的数据。
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.example.MyViewModel" />
</data>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.data}" />
</layout>
ViewModel 主要用于以下场景:
通过以上方法,可以有效解决从第二个片段访问时 ViewModel 数据丢失的问题。
领取专属 10元无门槛券
手把手带您无忧上云