SavedStateHandle 简单用法

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;
            }
        }
    }
}

好像编写的变长了,但是总感觉牛逼哄哄的样子,反正也是闲着,就改用这个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值