赞
踩
首先,ViewModel是什么.
ViewModel是一个以注重生命周期存储和管理界面相关数据的类。ViewModel可以让数据在发生如屏幕旋转等配置更改后继续存留。
比如我现在在Activity里定义了一个Int型的变量x初始化为0。在Activity运行期间,我点击了一个按钮让x的值变为1。假如此时我旋转,等屏幕旋转后,Activity重建。那x的值会被重新设置为0。现在我们使用ViewModel,让x的值在屏幕旋转之后还是1。
开始使用ViewModel
实现一个ViewModel我们可以创建一个类来继承ViewModel类,并在里面定义一个Int型的变量,初始化为0.
- class NumViewModel : ViewModel() {
- var num: Int = 0
- }
接着在Activity的onCreate()方法中获取我们的NumViewModel (在依赖了Android KTX 中的 Fragment KTX模块后,可以直接使用viewModels和activityViewModels属性委托绑定到ViewModel
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_main)
- val model = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory())
- .get(NumViewModel::class.java)
- }
现在我点击一个按钮让NumViewModel中的x的值变为1。假如此时旋转屏幕,在Activity重建后,NumViewModel中x的值还是为1。
使用ViewModel在Fragment之间共享数据
我们可以使用ViewModel在Fragment之间共享数据,只要我们的Fragment获取ViewModel时是使用的是包含他们的Activity,这里使用的是requireActivity()方法,他返回一个不为空的Activity。此时他们获取的是同一个SharedViewmodel的实例
- class SharedViewModel : ViewModel() {
- val selected = MutableLiveData<String>()
- fun select(string: String) {
- selected.value = string
- }
- }
-
- class OneFragment : Fragment(){
- private lateinit var sharedViewModel: SharedViewModel
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- sharedViewModel = ViewModelProvider(requireActivity(),
- ViewModelProvider.NewInstanceFactory()).get(SharedViewModel::class.java)
- }
- }
-
- class TwoFragment : Fragment(){
- private lateinit var sharedViewModel: SharedViewModel
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- sharedViewModel = ViewModelProvider(requireActivity(),
- ViewModelProvider.NewInstanceFactory()).get(SharedViewModel::class.java)
- }
- }
ViewModel对象的获取
我们在创建ViewModel对象的时候使用了ViewModelProvider,下面是它的构造方法:
public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。