SavedStateHandle 使用
savedStateHandle 可以保存界面的一些奇怪状态,有点像onSaveInstanceState(),但是好像比onSaveInstanceState()稍微强大一丢丢,好像用起来还挺顺手。还和ViewModel搞了联动,用起来又变强大了。
常规保存状态的操作
public class SavedStateAty extends Activity{
private AtySavedStateBinding _binding;
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString("content", _binding.tv.getText().toString());
super.onSaveInstanceState(outState);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_binding = AtySavedStateBinding.inflate(getLayoutInflater());
setContentView(_binding.getRoot());
_binding.btn.setOnClickListener(v -> {
String content = _binding.edit.getText().toString();
_binding.edit.getEditableText().clear();
_binding.tv.setText(content);
});
if (null != savedInstanceState) {
_binding.tv.setText(savedInstanceState.getString("content", ""));
}
}
}
新玩具的保存状态使用
public class SavedStateAty extends Aty {
private MySavedStateViewModel _viewModel;
private AtySavedStateBinding _binding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_binding = AtySavedStateBinding.inflate(getLayoutInflater());
setContentView(_binding.getRoot());
_viewModel = new ViewModelProvider(this).get(MySavedStateViewModel.class);
_binding.btn.setOnClickListener(v -> {
String content = _binding.edit.getText().toString();
_binding.edit.getEditableText().clear();
_viewModel.setContent(content);
});
_viewModel.getContent().observe(this, _binding.tv::setText);
}
public static class MySavedStateViewModel extends AndroidViewModel {
private final SavedStateHandle handle;
private MutableLiveData<String> content;
public MySavedStateViewModel(Application application, SavedStateHandle handle) {
super(application);
this.handle = handle;
//具体保存方法
this.handle.setSavedStateProvider("temp_my_saved", new MySavedStateProvider());
}
public void setContent(String content) {
this.content.setValue(content);
}
public LiveData<String> getContent() {
if (null == content) {
content = handle.getLiveData("content", "");
}
return content;
}
private class MySavedStateProvider implements SavedStateRegistry.SavedStateProvider {
@NonNull
@Override
public Bundle saveState() {
//具体保存方法
Bundle bundle = new Bundle();
bundle.putString("content", getContent().getValue());
return bundle;
}
}
}
}
好像编写的变长了,但是总感觉牛逼哄哄的样子,反正也是闲着,就改用这个