与 ObservableField<> 的 2 向数据绑定,set() 不起作用?
2-way databinding with ObservableField<>, set() doesn't work?
我有一个parentclass,我们叫它BaseViewModel,这个class可以打字,有一个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);
}
}
为了这个class我得到了很多child。其中之一是 StringViewModel,顾名思义,它提供一个字符串值。此 child class 覆盖 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 膨胀我的数据绑定)。
myDataBinding.setViewModel(new StringViewModel());
有人对此行为有解释吗?
编辑
正如@iMDroid 所说,我应该在我的方法 setValue()
中调用 notifyChange()
。我认为 ObservableFields 是为我做的,我的错。
将 StringViewModel 添加到布局中是不够的。在 onCreate() 或 onCreateView() 中,具体取决于您使用的(Activity 或 Fragment),您必须告诉您的数据绑定使用定义的 StringViewModel class.
在 onCreate() 中,您想做一些事情,
dataBinding.viewModel = new StringViewModel();
现在,dataBinding 知道你的意思,它们现在已连接。
我相信你已经设置了数据绑定。
我不是双向数据绑定方面的专家..但我一直在阅读有关它的文章,所以这里有一个可能对您有所帮助的解决方案。
假设您的模型 class 是这样的:
public class Echo {
public String text;
}
你的布局文件是R.layout.echo
They say you are supposed to set the layout using the
DataBindingUtil class and then the object on which you make the binding that is EchoBinding (automatically generated
according to the layout) like this:
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。
你可以试一试..希望对你有帮助。
我有一个parentclass,我们叫它BaseViewModel,这个class可以打字,有一个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);
}
}
为了这个class我得到了很多child。其中之一是 StringViewModel,顾名思义,它提供一个字符串值。此 child class 覆盖 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 膨胀我的数据绑定)。
myDataBinding.setViewModel(new StringViewModel());
有人对此行为有解释吗?
编辑
正如@iMDroid 所说,我应该在我的方法 setValue()
中调用 notifyChange()
。我认为 ObservableFields 是为我做的,我的错。
将 StringViewModel 添加到布局中是不够的。在 onCreate() 或 onCreateView() 中,具体取决于您使用的(Activity 或 Fragment),您必须告诉您的数据绑定使用定义的 StringViewModel class.
在 onCreate() 中,您想做一些事情,
dataBinding.viewModel = new StringViewModel();
现在,dataBinding 知道你的意思,它们现在已连接。
我相信你已经设置了数据绑定。
我不是双向数据绑定方面的专家..但我一直在阅读有关它的文章,所以这里有一个可能对您有所帮助的解决方案。
假设您的模型 class 是这样的:
public class Echo {
public String text;
}
你的布局文件是R.layout.echo
They say you are supposed to set the layout using the DataBindingUtil class and then the object on which you make the binding that is EchoBinding (automatically generated according to the layout) like this:
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。
你可以试一试..希望对你有帮助。