我在理解Fragment + ViewModel范例如何与EditText之类的视图一起工作时遇到麻烦。
它是一个EditText,显然它将在View(片段)中进行修改。但我也希望能够在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) { }
});
如您所见,我设置了observer,因此当我更改MutableLiveData的值时,视图也会更改。我设置了一个[[watcher,所以当我(使用应用程序时)更改View的值时,MutableLiveData也会更改。
这是ModelView类的代码:public void addRegister() {
...
String comment = this.comment.getValue();
...
this.comment.setValue("");
[当我运行该应用程序时,没有错误弹出,但挂起。我猜是因为无限循环。如何使用此View + ViewModel范例处理EditTexts?我不明白什么?非常感谢!
build.gradle:
android {
dataBinding {
enabled = true
}
}
布局:
<layout>
元素EditText
连接到视图模型<layout>
<data>
<variable
name="viewModel"
type="com.mycompany.AddRegisterViewModel" />
</data>
<EditText
android:id="..."
android:layout_width="..."
android:layout_height="..."
android:text="@={viewModel.getComment()}" />
</layout>
注意,您需要等号@=
才能进行双向数据绑定。如果仅使用@{viewModel.getComment()}
,则以编程方式设置实时数据值将更新编辑文本,但另一种方法将无效。注意:
ObservableField
代替MutableLiveData
进行数据绑定@={viewModel.comment}
之类的方法引用来引用xml中的实时数据>