与EditText冲突:观察者对视图+观察者对MutableLiveData

问题描述 投票:0回答:1

我在理解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?我不明白什么?

非常感谢!

java android view viewmodel mutablelivedata
1个回答
0
投票
您可以为此使用双向数据绑定:

    当用户输入文本时:实时数据将被更新
  • 如果您通过编程方式设置实时数据值,则将更新EditText内容
  • 您应该能够在活动中删除这两个侦听器,因为数据绑定会为您这样做。

    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中的实时数据>
  • 参考:用于双向数据绑定的Android文档:https://developer.android.com/topic/libraries/data-binding/two-way
  • © www.soinside.com 2019 - 2024. All rights reserved.