千家信息网

Android如何通过ViewModel保存数据实现多页面的数据共享功能

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,小编给大家分享一下Android如何通过ViewModel保存数据实现多页面的数据共享功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起
千家信息网最后更新 2025年11月07日Android如何通过ViewModel保存数据实现多页面的数据共享功能

小编给大家分享一下Android如何通过ViewModel保存数据实现多页面的数据共享功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

通过ViewModel实现的数据共享符合Android的MVC设计模式,将数据独立出来

实现的Demo

1、主页面通过SeekBar 来改变数字的值

2、点击进入就进入第二个界面,但是数据还是共享的

3、随便加两个数字上去,再次切换

4、发现数据还是共享的

下面是具体实现步骤:

1、建立两个Fragment(使用了Binding 和 Navigation)

一点要添加Binding 和 Navigation 不然做不了

2、建立一个继承于ViewModel的类

3、分别在两个Fragment的代码中使用继承于ViewModel的那个类,就可以实现数据共享

下面是具体代码:

1、继承于ViewModel的类

package com.example.naviation01;import androidx.lifecycle.MutableLiveData;import androidx.lifecycle.ViewModel;public class MyViewMode extends ViewModel { private MutableLiveData number; public MutableLiveData 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); } }}

2、Fragment 主页

package com.example.naviation01;import android.os.Bundle;import androidx.databinding.DataBindingUtil;import androidx.fragment.app.Fragment;import androidx.fragment.app.FragmentController;import androidx.lifecycle.ViewModel;import androidx.lifecycle.ViewModelProvider;import androidx.lifecycle.ViewModelProviders;import androidx.navigation.NavController;import androidx.navigation.Navigation;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.SeekBar;import com.example.naviation01.databinding.FragmentHomeBinding;/** * A simple {@link Fragment} subclass. */public class HomeFragment extends Fragment { public HomeFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment final MyViewMode myViewMode; myViewMode = ViewModelProviders.of(getActivity()).get(MyViewMode.class); FragmentHomeBinding binding; binding = DataBindingUtil.inflate(inflater,R.layout.fragment_home,container,false); binding.setData(myViewMode); binding.setLifecycleOwner(getActivity()); binding.seekBar.setProgress(myViewMode.getNumber().getValue()); binding.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { myViewMode.getNumber().setValue(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); binding.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { NavController controller = Navigation.findNavController(v); controller.navigate(R.id.action_homeFragment_to_detailFragment); } }); return binding.getRoot(); //return inflater.inflate(R.layout.fragment_home, container, false); }}

xml

0