双向数据绑定在 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 中使用 BaseObservableWord 并通知 属性 已更改。

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);
  }
}