java - SavedState ViewModel 使用 SavedStateViewModelFactory
问题描述
我正在关注谷歌的这个 codelab,但它无法保存数据。链接在这里
https://codelabs.developers.google.com/codelabs/android-lifecycles/#6
活动课
public class SavedStateActivity extends AppCompatActivity {
private SavedStateViewModel mSavedStateViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.saved_state_activity);
// Obtain the ViewModel
// mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);
mSavedStateViewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this)).get(SavedStateViewModel.class);
// Show the ViewModel property's value in a TextView
mSavedStateViewModel.getName().observe(this, new Observer<String>() {
@Override
public void onChanged(String savedString) {
((TextView)findViewById(R.id.saved_vm_tv))
.setText(getString(R.string.saved_in_vm, savedString));
}
});
// Save button
findViewById(R.id.save_bt).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String newName = ((EditText)findViewById(R.id.name_et)).getText().toString();
mSavedStateViewModel.saveNewName(newName);
}
});
}
}
视图模型类
public class SavedStateViewModel extends ViewModel {
private static final String NAME_KEY = "name";
private SavedStateHandle mState;
public SavedStateViewModel(SavedStateHandle savedStateHandle) {
mState = savedStateHandle;
}
// Expose an immutable LiveData
LiveData<String> getName() {
// getLiveData obtains an object that is associated with the key wrapped in a LiveData
// so it can be observed for changes.
return mState.getLiveData(NAME_KEY);
}
void saveNewName(String newName) {
// Sets a new value for the object associated to the key. There's no need to set it
// as a LiveData.
mState.set(NAME_KEY, newName);
}
}
如您所见,我已经添加了SavedStateViewModelFactory
at
mSavedStateViewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this)).get(SavedStateViewModel.class);
但是当我销毁应用程序并打开它时,没有任何效果,数据仍然没有保留。
解决方案
谷歌表示,该解决方案仍处于已保存状态的测试阶段。目前,唯一保存数据的解决方案是使用 Room。
推荐阅读
- angularjs - 绑定在angularjs中不起作用
- swift - 用 swiftyJSON 解析
- javascript - 1 秒后使用 keyup 触发器在 span 内自动键入文本
- java - 我需要在给定条件下从弹出菜单中隐藏/显示特定项目
- javascript - Vue将HTML写成字符串变量/字符串模板的方式
- python - OpenGL pygame 移动对象
- r - 使用第二个数据帧值按值过滤数据帧
- java - 如何将两个 JTextfields 添加到“北”,否则我会在 java 中说类似的方向
- java - Java中正则表达式的结果超出了我的预期
- ios - Firebase:iOS:Firebase读取后数组为空