配置
android studio目前已经集成了dataBinding,只需在build.gradle中配置,如下:
android { dataBinding { enabled = true; }}
布局文件
使用 Data Binding 之后,xml的布局文件就不再单纯地展示 UI 元素,还需要定义 UI 元素用到的变量。所以,它的根节点不再是一个 ViewGroup
,而是变成了 layout
,并且新增了一个节点 data
。
....
要实现 MVVM 的 ViewModel 就需要把数据与UI进行绑定,data
节点就为此提供了一个桥梁,我们先在 data
中声明一个 variable
,这个变量会为 UI 元素提供数据(例如 TextView 的 android:text),然后在 代码中把”后台”数据与这个 variable
进行绑定。
数据对象
添加一个entity类,NewsEntity
public class NewsEntity extends BaseObservable { private String name; private String title; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); } @Bindable public String getTitle() { return title; } public void setTitle(String title) { this.title = title; notifyPropertyChanged(BR.title); }}
定义 Variable
再回到布局文件,在 data
节点中声明一个变量 news
绑定 Variable
修改 Activity
的 onCreate
方法,用 DatabindingUtil.setContentView()
来替换掉 setContentView()
,然后创建一个 NewsEntity对象,通过 binding.setNews(news)
与 variable
进行绑定。
高级用法
使用类方法
首先为类添加一个静态方法
public class MyStringUtils { public static String capitalize(final String word) { if (word.length() > 1) { return String.valueOf(word.charAt(0)).toUpperCase() + word.substring(1); } return word; } }
然后在 xml 的 data
节点中导入:
使用方法与 Java 语法一样:
类型别名
如果我们在 data
节点了导入了两个同名的类怎么办?
这样一来出现了两个 User
类,那 user
变量要用哪一个呢?不用担心,import
还有一个 alias
属性。
Null Coalescing 运算符
android:text="@{user.displayName ?? user.lastName}"
就等价于
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
属性值
通过 ${}
可以直接把 Java 中定义的属性值赋值给 xml 属性。