Android通过ViewModel保存数据实现多页面的数据共享功能
通过ViewModel实现的数据共享符合Android的MVC设计模式,将数据独立出来
成都创新互联主要从事成都网站建设、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务汤旺,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
实现的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
<?xml version="1.0" encoding="utf-8"?>
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;
/**
* A simple {@link Fragment} subclass.
*/
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
<?xml version="1.0" encoding="utf-8"?>
4、xml Main_Activity
<?xml version="1.0" encoding="utf-8"?>
总结
以上所述是小编给大家介绍的Android通过ViewModel保存数据实现多页面的数据共享功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对创新互联网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
新闻名称:Android通过ViewModel保存数据实现多页面的数据共享功能
本文链接:http://www.jxjierui.cn/article/iphheh.html


咨询
建站咨询
