DataBinding 是 Android Jetpack 套件下的一个库,其作用是使用声明性格式将布局中的界面组件绑定到应用中的数据源。借助布局文件中的绑定组件,你可以移除 Activity 中的许多界面框架调用,使其维护起来更简单、方便。还可以提高应用性能,并且有助于防止内存泄漏以及避免发生 Null 指针异常。
✦ 注意: 在许多情况下,视图绑定可简化实现,提高性能,提供与数据绑定相同的好处。如果你使用数据绑定的主要目的是取代 findViewById() 调用,请考虑改用视图绑定。
1. 开始准备
DataBinding 库与 Android Gradle 插件捆绑在一起。所以无需声明对此库的依赖项,但必须启用它。如需启用 DataBinding,需要在 Modle 级的 build.gradle 文件中将 dataBinding 构建选项设置为 true,如下所示:
1 | android { |
2. 布局转换
启用 DataBinding 之后,将光标停留在布局文件的最外层控件位置,在本例中光标位置为第二行。
1 |
|
✦ 注意: Windows 请按快捷键 Alt + 回车,Mac 请按快捷键 option + 回车,执行 Convert to data binding layout 操作完成布局转换。
1 |
|
3. 基本用法
新建实体类 User.java 并重写构造方法以及 Get、Set 方法,如下所示:
1 | package com.sunzn.bind; |
在布局文件的 <data> 标签下加入以下代码:
1 | <data> |
注意:name 为标签名,type 为类的全路径。
如果一个页面需要绑定同类型的不同实体,可以使用 <import> 标签将引用类导入,然后再使用 <variable> 标签为不同的实体进行命名,这里需要注意的是 type 的值为引用类的类名。如下所示:
1 | <data> |
但是,如果导入了多个类名相同但包名不同的类,就会产生冲突,并且在编译阶段报错。比如下面这总情况:
1 | <import type="com.sunzn.bind.User" /> |
此时需要使用 alias 属性设置别名来解决冲突,使用方式如下:
1 | <data> |
这时如果需要将 User 的信息展示在布局文件中的 AppCompatTextView 上,可以使用赋值表达式 @{} 语法进行绑定,参见文档:数据绑定库。具体绑定过程如下:
1 |
|
✦ 注意: User 的 id 字段为 int 类型,如需展示在文本控件上需要使用 String.valueOf(user.id) 将其转换为 String 类型。
布局文件的绑定只是完成了形式上的绑定,真正的赋值还要通过 DataBindingUtil 生成的 ViewDataBinding 来实现,赋值过程如下:
1 | package com.sunzn.data; |
4. 运行结果
