双向数据绑定在Android

时间:2017-01-08 15:51:02

标签: java android data-binding android-databinding

我知道过去有过像this one这样的讨论。但是,它似乎对我不起作用。这就是我的布局中的内容:

  <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'

我的app gradle有:

dataBinding {
    enabled = true
}

和我的MainActivity的onCreate:

MainBinding binding = DataBindingUtil.setContentView(this, R.layout.main);
Word word = new Word("Test Word");
binding.setWord(word);

这里是Word类,一个简单的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组件没有得到更新。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您只需在模型类中使用BaseObservable,即Word,并通知该属性已更改。

public class Word extends BaseObservable {
    public void setContents(String contents) {
        this.contents = contents;
        notifyPropertyChanged(BR.contents);
    }
}

答案 1 :(得分:0)

更新您的Java文件,如

MainBinding binding = DataBindingUtil.setContentView(this, R.layout.main);
Word word = new Word();
word.setContents("Test Word");
binding.setWord(word);

可以更新Word类,

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