Android 使用ObserveField进行双向数据绑定<>;,set()不';不行?
我有一个父类,我们称之为BaseViewModel,这个类可以是类型化的,并且有一个相同类型的ObservableField。像这样: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(
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}"/>