双向数据绑定在 Android 中不起作用
Two-way data binding not working in Android
我知道过去有一些关于此的讨论,例如 。但是,它似乎对我不起作用。这是我的布局中的内容:
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{word.contents}"
android:id="@+id/wordView"/>
<EditText android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/wordInput"
android:text="@={word.contents}"/>
我希望我的 TextView 在我键入时在 EditText 中显示更新的文本。但它不会发生。我可以通过实现我自己的 Text Watchers 来让它工作,但我认为数据绑定的全部意义在于避免这样做。我在这里错过了什么吗?我需要做更多吗?我发现有些人建议让数据可观察或可绑定,但我不想弄乱我的模型对象。这是我的 gradle 依赖关系:
classpath 'com.android.tools.build:gradle:2.2.3'
我的应用 gradle 有:
dataBinding {
enabled = true
}
并且在我的 MainActivity 的 onCreate 中:
MainBinding binding = DataBindingUtil.setContentView(this, R.layout.main);
Word word = new Word("Test Word");
binding.setWord(word);
这里是 Word class,一个简单的 POJO:
public class Word {
private String contents;
public Word() {
contents = "";
}
public Word(String contents) {
this.contents = contents;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
}
另外,我调试了应用程序,在我的 setContents 方法中留下了一个断点。我可以看到在更改 EditText 时,代码在断点处停止并且模型实际上发生了变化。看起来 TextView 组件没有得到更新。有什么想法吗?
您只需要在模型 class 中使用 BaseObservable
即 Word
并通知 属性 已更改。
public class Word extends BaseObservable {
public void setContents(String contents) {
this.contents = contents;
notifyPropertyChanged(BR.contents);
}
}
更新您的 Java 文件,例如
MainBinding binding = DataBindingUtil.setContentView(this, R.layout.main);
Word word = new Word();
word.setContents("Test Word");
binding.setWord(word);
你能更新 Word class 吗,
public class Word extends BaseObservable {
private String contents;
public Word() {
contents = "";
}
public Word(String contents) {
this.contents = contents;
}
@Bindable
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
notifyPropertyChanged(BR.contents);
}
}
我知道过去有一些关于此的讨论,例如
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{word.contents}"
android:id="@+id/wordView"/>
<EditText android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/wordInput"
android:text="@={word.contents}"/>
我希望我的 TextView 在我键入时在 EditText 中显示更新的文本。但它不会发生。我可以通过实现我自己的 Text Watchers 来让它工作,但我认为数据绑定的全部意义在于避免这样做。我在这里错过了什么吗?我需要做更多吗?我发现有些人建议让数据可观察或可绑定,但我不想弄乱我的模型对象。这是我的 gradle 依赖关系:
classpath 'com.android.tools.build:gradle:2.2.3'
我的应用 gradle 有:
dataBinding {
enabled = true
}
并且在我的 MainActivity 的 onCreate 中:
MainBinding binding = DataBindingUtil.setContentView(this, R.layout.main);
Word word = new Word("Test Word");
binding.setWord(word);
这里是 Word class,一个简单的 POJO:
public class Word {
private String contents;
public Word() {
contents = "";
}
public Word(String contents) {
this.contents = contents;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
}
另外,我调试了应用程序,在我的 setContents 方法中留下了一个断点。我可以看到在更改 EditText 时,代码在断点处停止并且模型实际上发生了变化。看起来 TextView 组件没有得到更新。有什么想法吗?
您只需要在模型 class 中使用 BaseObservable
即 Word
并通知 属性 已更改。
public class Word extends BaseObservable {
public void setContents(String contents) {
this.contents = contents;
notifyPropertyChanged(BR.contents);
}
}
更新您的 Java 文件,例如
MainBinding binding = DataBindingUtil.setContentView(this, R.layout.main);
Word word = new Word();
word.setContents("Test Word");
binding.setWord(word);
你能更新 Word class 吗,
public class Word extends BaseObservable {
private String contents;
public Word() {
contents = "";
}
public Word(String contents) {
this.contents = contents;
}
@Bindable
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
notifyPropertyChanged(BR.contents);
}
}