我有一个父类,我们称之为 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 正在为我做这件事,我的不好。
答案 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。