栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;

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



  
    
  
  
    
      
      
      

3、Fragment 副页

package com.example.naviation01;
import android.os.Bundle;
import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.Fragment;
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 com.example.naviation01.databinding.FragmentDetailBinding;

public class DetailFragment extends Fragment {
  public DetailFragment() {
    // Required empty public constructor
  }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
 Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    MyViewMode myViewMode;
    myViewMode = ViewModelProviders.of(getActivity()).get(MyViewMode.class);
    FragmentDetailBinding binding;
    binding = DataBindingUtil.inflate(inflater,R.layout.fragment_detail,container,false);
    binding.setDate(myViewMode);
    binding.setLifecycleOwner(getActivity());
    binding.button4.setonClickListener(new View.onClickListener() {
      @Override
      public void onClick(View v) {
 NavController controller = Navigation.findNavController(v);
 controller.navigate(R.id.action_detailFragment_to_homeFragment);
      }
    });
    return binding.getRoot();
    //return inflater.inflate(R.layout.fragment_detail, container, false);
  }
}

xml



  
    
  
  
    
      
      

4、xml Main_Activity



  

总结

以上所述是小编给大家介绍的Android通过ViewModel保存数据实现多页面的数据共享功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/154690.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号