Android 使用ObserveField进行双向数据绑定<>;,set()不';不行?

Android 使用ObserveField进行双向数据绑定<>;,set()不';不行?,android,android-databinding,2-way-object-databinding,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(

我有一个父类,我们称之为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);
    }

}
公共类BaseViewModel扩展了BaseObservable{
ObservableField值=新的ObservableField();
公共T getValue(){
返回值。get();
}
公共无效设置值(T值){
此.value.set(值);
setHasChanges(值!=原始值);
}
}
这个班我有很多孩子。其中之一是StringViewModel,正如其名称所示,它提供了一个字符串值。此子类重写setValue()方法:

公共类StringViewModel扩展了BaseViewModel{
@凌驾
公共void设置值(字符串值){
此.value.set(值);
if(value!=null&&!value.isEmpty()){
setHasChanges(!value.equals(originalValue));
}
else if(originalValue==null)
setHasChanges(假);
其他的
setHasChanges(!originalValue.isEmpty());
}
//其他方法。。。
}
我得到了一个使用StringViewModel的布局:


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

编辑:我还应该说,我已经正确地将StringViewModel添加到数据绑定中(使用DataBindingUtil膨胀数据绑定)

myDataBinding.setViewModel(新的StringViewModel())

有人对这种行为有什么解释吗


编辑


正如@iMDroid所说,我应该在方法
setValue()
中调用
notifyChange()
。我认为ObservableFields是为我做的,我的错。

将StringViewModel添加到布局中是不够的。在onCreate()或onCreateView()中,根据您使用的是哪个(活动或片段),您必须告诉您的数据绑定使用定义的StringViewModel类

在onCreate()中,您希望执行以下操作:

dataBinding.viewModel=新的StringViewModel()

现在,数据绑定知道您的意思,它们现在已连接


我相信您已经设置了数据绑定。

我不擅长双向数据绑定。。但我一直在读有关它的文章,所以这里有一个解决方案可能会帮助你

假设您的模型类为:

public class Echo {
  public String text;
}
您的布局文件是
R.layout.echo

他们说你应该使用 DataBindingUtil类,然后是进行EchoBinding(自动生成)绑定的对象 根据布局)如下所示:

此外,您还可以使用
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()
方法中

有关更多信息,请参阅此


你可以试一试。。希望有帮助。

是的,我将StringViewModel设置为数据绑定。很抱歉,我将更新我的问题以添加此信息。感谢您的帮助,但在编辑我的问题时,我忘记提及这一点。实际上,我已经正确地使用DataBindingUtil将我的变量添加到数据绑定中。甚至我已经编辑了我的答案。。您是否尝试添加notifyChange()?很好,它正在工作!我想因为它是可观察的,所以我不需要通知任何事情,我的错。谢谢你的帮助,我接受这个答案。
public class Echo {
  public String text;
}
 EchoBinding binding = DataBindingUtil.setContentView(
      this, R.layout.echo);
    binding.setEcho(new Echo());
<EditText
  android:layout_width=”match_parent”
  android:layout_height=”wrap_content”
  android:hint="Text 1"
  app:binding="@{echo.text}"/>