Android 与房间 table 模型的双向数据绑定
Android two way data binding with room table models
所以我有房间模型 classes 用 @Entity 注释注释,其中包含用 @ColumnInfo 注释的字段。
我还有一个绑定到这个模型对象的视图:
<EditText
android:id="@+id/sadfadsdfasd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="@string/assdsa"
android:inputType="text"
android:text="@={fuelPrice.modification}" />
像这样在显示EditText的时候就可以了。它显示了我的模型的价值,但是当我修改 EditText 时,即使我使用 @= 符号指示双向绑定,该修改也没有存储在我的对象中。
因此,如果我理解正确的话,我不能真正将 POJO 与简单的原始字段一起用于双向数据绑定,而是我应该将所有字段作为所需类型的可观察对象或包含在 LiveData 中的字段?
如果上述情况成立,是否意味着要对房间实体进行两种方式的绑定,我必须为每个实体创建单独的 class,这将实现所有可观察字段并相应地更新我的实体对象?或者有更简单的解决方案吗?
编辑
以上案例为假。似乎两种方式的绑定确实适用于具有适当的 getter 和 setter 的简单 POJO classes。
您可以按如下方式使用 observableField:
public class FuelPrice {
public ObservableField<String> modification = new ObservableField<>();
public TextWatcher watcher = new TextWatcherAdapter() {
@Override public void afterTextChanged(Editable s) {
if (!Objects.equals(modification.get(), s.toString())) {
modification.set(s.toString());
}
}
};
}
并更新您的 XML 如下:
<EditText
android:id="@+id/sadfadsdfasd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="@string/assdsa"
android:inputType="text"
android:addTextChangedListener=”@{fuelPrice.watcher}” />
参考:
.
AFAIK 我刚刚测试了它,它应该在没有 ObservableField 的情况下工作,因为 modification
是一个具有标准 getter 和 setter 的私有字段。使用
android:text="@={fueldPrice.modification}"
和
class FuelPrice {
private String modification;
public String getModification() {
return modification;
}
public String setModification(String modification) {
this.modification = modification;
}
}
如果您只使用 public 字段,它也有效
class FuelPrice {
public String modification;
}
所以我有房间模型 classes 用 @Entity 注释注释,其中包含用 @ColumnInfo 注释的字段。
我还有一个绑定到这个模型对象的视图:
<EditText
android:id="@+id/sadfadsdfasd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="@string/assdsa"
android:inputType="text"
android:text="@={fuelPrice.modification}" />
像这样在显示EditText的时候就可以了。它显示了我的模型的价值,但是当我修改 EditText 时,即使我使用 @= 符号指示双向绑定,该修改也没有存储在我的对象中。
因此,如果我理解正确的话,我不能真正将 POJO 与简单的原始字段一起用于双向数据绑定,而是我应该将所有字段作为所需类型的可观察对象或包含在 LiveData 中的字段?
如果上述情况成立,是否意味着要对房间实体进行两种方式的绑定,我必须为每个实体创建单独的 class,这将实现所有可观察字段并相应地更新我的实体对象?或者有更简单的解决方案吗?
编辑 以上案例为假。似乎两种方式的绑定确实适用于具有适当的 getter 和 setter 的简单 POJO classes。
您可以按如下方式使用 observableField:
public class FuelPrice {
public ObservableField<String> modification = new ObservableField<>();
public TextWatcher watcher = new TextWatcherAdapter() {
@Override public void afterTextChanged(Editable s) {
if (!Objects.equals(modification.get(), s.toString())) {
modification.set(s.toString());
}
}
};
}
并更新您的 XML 如下:
<EditText
android:id="@+id/sadfadsdfasd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:hint="@string/assdsa"
android:inputType="text"
android:addTextChangedListener=”@{fuelPrice.watcher}” />
参考:
.
AFAIK 我刚刚测试了它,它应该在没有 ObservableField 的情况下工作,因为 modification
是一个具有标准 getter 和 setter 的私有字段。使用
android:text="@={fueldPrice.modification}"
和
class FuelPrice {
private String modification;
public String getModification() {
return modification;
}
public String setModification(String modification) {
this.modification = modification;
}
}
如果您只使用 public 字段,它也有效
class FuelPrice {
public String modification;
}