JetPack
LiveData
Data Binding
ViewModel
Saved State
Navigation Graph
NavHost
Fragment
NavController
Saved State
旋转屏幕不丢失数据
Shared Preference
关机不丢失数据,保存到本地
build.gradle
android.defaultConfig.vectorDrawables.useSupportLibrary = true
dataBinding {
enabled true
}
activity_main.xml
<data>
<variable
name="data"
type="com.example.ballscore.MyViewModel" />
</data>
package com.example.ballscore;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import com.example.ballscore.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private MyViewModel myViewModel;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);//new ViewModelProvider(this).get(MyViewModel.class);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setData(myViewModel);
binding.setLifecycleOwner(this);
}
}
MyViewModel.java
package com.example.ballscore;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> scoreA;
private MutableLiveData<Integer> scoreB;
private Integer lastA;
private Integer lastB;
public MutableLiveData<Integer> getScoreA() {
if (scoreA == null) {
scoreA = new MutableLiveData<>();
scoreA.setValue(0);
}
return scoreA;
}
public MutableLiveData<Integer> getScoreB() {
if (scoreB == null) {
scoreB = new MutableLiveData<>();
scoreB.setValue(0);
}
return scoreB;
}
public void addScoreA(int score) {
scoreA.setValue(scoreA.getValue() + score);
lastB = null;
lastA = score;
}
public void addScoreB(int score) {
scoreB.setValue(scoreB.getValue() + score);
lastA = null;
lastB = score;
}
public void redo() {
if (lastA != null) {
addScoreA(-lastA);
}
if (lastB != null) {
addScoreB(-lastB);
}
}
public void reset() {
lastA = null;
lastB = null;
scoreA.setValue(0);
scoreB.setValue(0);
}
}
myViewModel = new ViewModelProvider(this, new SavedStateViewModelFactory(getApplication(), this)).get(MyViewModel.class);
package com.example.viewmodelrestore;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.SavedStateHandle;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private SavedStateHandle handle;
public MyViewModel(SavedStateHandle handle) {
this.handle = handle;
}
public MutableLiveData<Integer> getNum() {
if (!handle.contains(MainActivity.KEY_NUMBER)) {
handle.set(MainActivity.KEY_NUMBER, 0);
}
return handle.getLiveData(MainActivity.KEY_NUMBER);
}
public void add() {
getNum().setValue(getNum().getValue() + 1);
}
}
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0'
myViewModel = new ViewModelProvider(this, new SavedStateViewModelFactory(getApplication(), this)).get(MyViewModel.class);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setData(myViewModel);
binding.setLifecycleOwner(this);
private SharedPreferences sharedPreferences = getApplication().getSharedPreferences(getApplication().getResources().getString(R.string.sharedPreferenceName), Context.MODE_PRIVATE);
public void load() {
int x= sharedPreferences.getInt(key, 0);
handle.set(key, x);
}
public void save() {
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putInt(key, getNum().getValue());
edit.apply();
}
返回
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NavController navController = Navigation.findNavController(this, R.id.fragment);
NavigationUI.setupActionBarWithNavController(this, navController);
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.fragment);
return navController.navigateUp();
}
}
点击跳转
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
return inflater.inflate(R.layout.fragment_home, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getView().findViewById(R.id.button).setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_homeFragment_to_detailFragment));
}
}
Fragment Data binding
public class MainFragment extends Fragment {
public MainFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MyViewModel myViewModel = new ViewModelProvider(getActivity()).get(MyViewModel.class);
FragmentMainBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false);
binding.setData(myViewModel);
binding.setLifecycleOwner(getActivity());
return binding.getRoot();
}
}
MyViewModel myViewModel = new ViewModelProvider(getActivity(), new SavedStateViewModelFactory(getActivity().getApplication(), this)).get(MyViewModel.class);