通过ViewModel实现的数据共享符合Android的MVC设计模式,将数据独立出来
实现的Demo
1、主页面通过SeekBar 来改变数字的值
2、点击进入就进入第二个界面,但是数据还是共享的
3、随便加两个数字上去,再次切换
4、发现数据还是共享的
下面是具体实现步骤:
1、建立两个Fragment(使用了Binding 和 Navigation)
一点要添加Binding 和 Navigation 不然做不了
2、建立一个继承于ViewModel的类
3、分别在两个Fragment的代码中使用继承于ViewModel的那个类,就可以实现数据共享
下面是具体代码:
1、继承于ViewModel的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.example.naviation01; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class MyViewMode 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 ); } } } |
2、Fragment 主页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<?xml version= "1.0" encoding= "utf-8" ?> <layout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:app= "http://schemas.android.com/apk/res-auto" xmlns:tools= "http://schemas.android.com/tools" > <data> <variable name= "data" type= "com.example.naviation01.MyViewMode" /> </data> <FrameLayout android:layout_width= "match_parent" android:layout_height= "match_parent" tools:context= ".HomeFragment" > <androidx.constraintlayout.widget.ConstraintLayout android:layout_width= "match_parent" android:layout_height= "match_parent" > <TextView android:id= "@+id/textView" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginStart= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" android:text= "@{String.valueOf(data.number)}" android:textSize= "30sp" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:layout_constraintVertical_bias= "0.255" /> <SeekBar android:id= "@+id/seekBar" android:layout_width= "0dp" android:layout_height= "wrap_content" android:layout_marginStart= "8dp" android:layout_marginTop= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintHorizontal_bias= "0.0" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:layout_constraintVertical_bias= "0.456" /> <Button android:id= "@+id/button" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginStart= "8dp" android:layout_marginTop= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" android:text= "@string/function01" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintHorizontal_bias= "0.498" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:layout_constraintVertical_bias= "0.679" /> </androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout> </layout> |
3、Fragment 副页
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
<?xml version= "1.0" encoding= "utf-8" ?> <layout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:app= "http://schemas.android.com/apk/res-auto" xmlns:tools= "http://schemas.android.com/tools" > <data> <variable name= "date" type= "com.example.naviation01.MyViewMode" /> </data> <FrameLayout android:layout_width= "match_parent" android:layout_height= "match_parent" tools:context= ".DetailFragment" > <androidx.constraintlayout.widget.ConstraintLayout android:layout_width= "match_parent" android:layout_height= "match_parent" > <TextView android:id= "@+id/textView3" android:layout_width= "131dp" android:layout_height= "55dp" android:layout_marginStart= "8dp" android:layout_marginTop= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" android:text= "@{String.valueOf(date.number)}" android:textSize= "30sp" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:layout_constraintVertical_bias= "0.23" /> <Button android:id= "@+id/button2" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginStart= "8dp" android:layout_marginTop= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" android:text= "@string/function02" android:onClick= "@{()->date.add(1)}" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintHorizontal_bias= "0.104" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:layout_constraintVertical_bias= "0.499" /> <Button android:id= "@+id/button3" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginStart= "8dp" android:layout_marginTop= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" android:text= "@string/function03" android:onClick= "@{()->date.add(-1)}" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintHorizontal_bias= "0.899" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:layout_constraintVertical_bias= "0.499" /> <Button android:id= "@+id/button4" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginStart= "8dp" android:layout_marginTop= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" android:text= "@string/function04" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintHorizontal_bias= "0.498" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:layout_constraintVertical_bias= "0.664" /> </androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout> </layout> |
4、xml Main_Activity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?xml version= "1.0" encoding= "utf-8" ?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:app= "http://schemas.android.com/apk/res-auto" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "match_parent" tools:context= ".MainActivity" > <fragment android:id= "@+id/fragment" android:name= "androidx.navigation.fragment.NavHostFragment" android:layout_width= "match_parent" android:layout_height= "match_parent" android:layout_marginTop= "8dp" android:layout_marginEnd= "8dp" android:layout_marginBottom= "8dp" app:defaultNavHost= "true" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" app:navGraph= "@navigation/nav_graph" /> </androidx.constraintlayout.widget.ConstraintLayout> |
总结
以上所述是小编给大家介绍的Android通过ViewModel保存数据实现多页面的数据共享功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://blog.csdn.net/weixin_43635647/article/details/102905617