gpt4 book ai didi

android - 与 ObservableField<> 的 2 向数据绑定(bind),set() 不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:18 29 4
gpt4 key购买 nike

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

}

这门课我有很多 child 。其中之一是 StringViewModel,正如其名称所示,它提供一个字符串值。这个子类覆盖了 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 ... -->

但是当我调用 StringViewModelsetValue() 方法时,该值设置为 ViewModel 而不是 编辑文本

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

myDataBinding.setViewModel(new StringViewModel());

有人对此行为有解释吗?


编辑

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

最佳答案

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

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

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}" 属性将该值绑定(bind)到您的 EditText。

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

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

引用这个link了解更多信息。

您可以尝试一下。希望对您有所帮助。

关于android - 与 ObservableField<> 的 2 向数据绑定(bind),set() 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39611171/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com