【发布时间】:2020-01-23 10:08:00
【问题描述】:
我无法理解 Fragment + ViewModel 范例如何与 EditText 之类的 View 一起使用。
它是一个 EditText,显然会在视图(片段)中进行修改。但我也希望能够在 ViewModel 中修改它:例如删除其文本。
这是 Fragment 类中的代码:
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
...
comment = mViewModel.getComment();
comment.observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(String s) {
commentView.setText(s);
}
});
...
commentView.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
mViewModel.setComment(String.valueOf(s));
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
});
如您所见,我设置了一个观察者,因此当我更改 MutableLiveData 的值时,视图会发生变化。我设置了一个 watcher,所以当我(使用应用程序时)更改 View 的值时,MutableLiveData 会发生变化。
这是 ModelView 类的代码:
public void addRegister() {
...
String comment = this.comment.getValue();
...
this.comment.setValue("");
当我运行应用程序时,没有弹出错误,但它挂起。我猜是因为无限循环。 我应该如何使用这种 View + ViewModel 范例来处理 EditTexts?我不明白什么?
提前非常感谢!
【问题讨论】:
-
getComment()的实现在哪里?你能展示你所有的 ViewModel 类吗 -
@Rafsanjani getComment() 只返回评论。这是片段:paste.debian.net/1127266,这是 ViewModel:paste.debian.net/1127265
-
能否提供 ViewModel 类代码?
-
@SamirSpahic 是的,这里是:paste.debian.net/1127265
-
尝试将getter字段改为
LiveData类型而不是MutableLiveData
标签: java android view viewmodel mutablelivedata