使用ObservableField<>,set()的双向数据绑定不起作用?

时间:2016-09-21 08:23:57

标签: android android-databinding 2-way-object-databinding

我有一个父类,我们称之为 BaseViewModel ,这个类可以输入并且具有相同类型的 ObservableField 。像这样:

public class BaseViewModel<T> extends BaseObservable {

    ObservableField<T> value = new ObservableField<>();

    public T getValue() {
        return value.get();
    }

    public void setValue(T value) {
        this.value.set(value);
        setHasChanges(value != originalValue);
    }

}

这节课让我有很多孩子。其中一个是 StringViewModel ,就像其名称所示,它给出了一个String值。此子类重写 setValue()方法:

public class StringViewModel extends BaseViewModel<String> {

    @Override
    public void setValue(String value) {
        this.value.set(value);
        if(value != null && !value.isEmpty()){
            setHasChanges(!value.equals(originalValue));
        }
        else if(originalValue == null)
            setHasChanges(false);
        else
            setHasChanges(!originalValue.isEmpty());
    }

    //Other methods ...

}

我得到了一个使用 StringViewModel 的布局:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type="com.myproject.viewmodels.StringViewModel" />

    </data>

    <EditText
        android:id="@+id/value"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:clickable="@{viewModel.editable}"
        android:cursorVisible="@{viewModel.editable}"

        android:ellipsize="end"
        android:focusable="@{viewModel.editable}"
        android:focusableInTouchMode="@{viewModel.editable}"
        android:inputType="textMultiLine|textNoSuggestions"

        android:text="@={viewModel.value}"
        app:setError="@{viewModel.error}"

        tools:text="Dupont" />

    <!-- Other layouts ... -->

但是当我调用 StringViewModel setValue() 方法时,该值设置为ViewModel,但不是 >的EditText

编辑:我还应该说我已正确地将 StringViewModel 添加到我的 DataBinding (使用 DataBindingUtil 来扩充我的DataBinding )。

myDataBinding.setViewModel(new StringViewModel());

是否有人对此行为有解释?

修改

正如@iMDroid所说,我应该在我的方法notifyChange()中拨打setValue()。我试着 ObservableFields 正在为我做这件事,我的不好。

2 个答案:

答案 0 :(得分:2)

我不是双向数据绑定的专家..但我一直在阅读有关它的文章,所以这里有一个可能对你有用的解决方案。

假设您的模型类是这样的:

public class Echo {
  public String text;
}

您的布局文件为R.layout.echo

  

他们说你应该用the来设置布局    DataBindingUtil 类,然后是您在其上进行绑定的对象,即EchoBinding(自动生成)   根据布局)这样:

 EchoBinding binding = DataBindingUtil.setContentView(
      this, R.layout.echo);
    binding.setEcho(new Echo());

此外,您可以使用app:binding="@{echo.text}"属性将值绑定到EditText。

<EditText
  android:layout_width=”match_parent”
  android:layout_height=”wrap_content”
  android:hint="Text 1"
  app:binding="@{echo.text}"/>

最后将notifyChange()添加到您的setValue()方法。

有关详细信息,请参阅此link

你可以尝试一下..希望它有所帮助。

答案 1 :(得分:0)

将StringViewModel添加到布局是不够的。在onCreate()或onCreateView()中,根据您使用的(Activity或Fragment),您必须告诉dataBinding使用已定义的StringViewModel类。

在onCreate()中,你想做类似的事情,

dataBinding.viewModel = new StringViewModel();

现在,dataBinding知道你的意思,现在他们已经连接了。

我相信你已经设置了dataBinding。