Android ViewModel实现跨页面数据共享

2 下载量 98 浏览量 更新于2024-08-30 收藏 158KB PDF 举报
"Android开发中的数据共享通过ViewModel实现" 在Android应用开发中,有效地管理数据并实现在多个页面之间的共享是至关重要的。`ViewModel` 类是Android架构组件之一,它提供了一种优雅的方式,使数据在Activity或Fragment的生命周期内保持存活,即使设备旋转或者发生其他配置变化,数据也不会丢失。在本示例中,我们将探讨如何利用`ViewModel` 实现数据共享,特别是在两个Fragment之间。 首先,我们看到这个示例中提到了`SeekBar`,这是一个用于调整数值的UI组件。在主页面上,用户可以通过`SeekBar` 修改一个数字的值。当用户导航到第二个Fragment时,这个数值仍然可以被访问和更新,展示了`ViewModel` 的数据持久性。 实现步骤如下: 1. 创建两个Fragment:在这个例子中,使用了Data Binding库和Navigation组件。Data Binding帮助我们更轻松地绑定UI和数据,而Navigation则简化了在不同屏幕间跳转的过程。确保在项目中正确导入这两个依赖项,因为它们是实现数据共享的关键。 2. 创建一个继承自`ViewModel`的类:定义一个新的类,如`MyViewModel`,并继承自`androidx.lifecycle.ViewModel`。在这个类中,我们可以创建一个`MutableLiveData`对象,用于存储我们需要共享的数据。`MutableLiveData` 是一个可观察的数据持有者,可以监听数据的变化,并自动通知订阅者。例如: ```java package com.example.naviation01; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class MyViewModel extends ViewModel { private MutableLiveData<Integer> number; public MutableLiveData<Integer> getNumber() { if (this.number == null) { this.number = new MutableLiveData<>(); this.number.setValue(0); } return this.number; } public void add(int x) { this.number.setValue(this.number.getValue() + x); if (this.number.getValue() < 0) { this.number.setValue(0); } } } ``` 在上述代码中,我们创建了一个名为`number`的`MutableLiveData`对象,并提供了获取和更新数值的方法。 3. 在Fragment中使用ViewModel:在每个Fragment中,我们需要实例化`MyViewModel` 并订阅`number` 的变化。这样,当数据在任何地方被修改时,所有订阅者都会收到通知。例如,在主Fragment中,你可以这样做: ```java package com.example.naviation01; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelStoreOwner; // ...其他导入 public class MainFragment extends Fragment { private MyViewModel viewModel; @Override public void onActivityCreated(@NonNull Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); viewModel = new ViewModelProvider((ViewModelStoreOwner) requireActivity()).get(MyViewModel.class); // 绑定数据到UI DataBindingUtil.setVariable(binding, BR.viewModel, viewModel); // 更新 SeekBar 的值 viewModel.getNumber().observe(getViewLifecycleOwner(), new Observer<Integer>() { @Override public void onChanged(Integer number) { binding.seekBar.setProgress(number); } }); } // ...其他方法 } ``` 同样,你可以在第二个Fragment中使用相同的方法获取`MyViewModel` 的实例,以便在该Fragment中访问和更新数据。 通过这种方式,`ViewModel`确保了数据在不同Fragment之间的一致性和共享。无论用户如何导航,只要`ViewModel` 的生命周期还在,数据就会保持其状态,从而实现跨页面的数据共享功能。这种做法遵循了MVC(Model-View-Controller)设计模式,将数据模型与视图分离,提高了代码的可维护性和复用性。