背景
Google在2015年的I/O大会上发布了三个重要的支持库:
- Material Design支持库:Android Support Design
- 百分比布局支持库:Percent support lib
- 数据绑定支持库:Data Binding Library
Data Binding有什么作用
- 是官方支持的MVVM模式框架
可以直接在静态布局XML中绑定数据,无需再findViewById,然后再手动设置数据
Question:是不是RoboGuice、AndroidAnotations...这样的依赖注入框架会慢慢淡出市场
- 可以提高解析XML的速度
- UI与功能解耦
Data Binding的需求与支持
需求
- Android Studio 1.3.0-beta1 或更高版本
- Gradle plugin 1.3.0以上
支持
- Android 2.1(API level 7+)以上
如何使用Data Binding
配置
Gradle 插件为1.3的配置
在工程的根build.gradle文件中配置如下:
1 | dependencies { |
在app的build.gradle文件中配置如下:
1 | apply plugin: 'com.android.application' |
Gradle 插件为1.5.+的配置:
只需要在app的build.gradle文件中如下配置就ok:
1 | android { |
使用流程
第一步:创建XML
1 | <?xml version="1.0" encoding="utf-8"?> |
第二步:定义数据
1 | public class User { |
第三步:绑定数据
1 | @Override |
Data Binding使用之详细介绍
使用类方法
1 | <data> |
类型别名
1 | <data> |
Null Coalescing运算符
空聚合运算操作(??), 如果左边的运算对象不为空的话选择左边,否则选择右边1
android:text="@{user.displayName ?? user.lastName}"
这个运算等价于:1
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
使用属性值
如下,我们要使用View的Visible属性:
1 | <data> |
使用资源数据
Data Binding也是支持直接访问资源数据的1
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
带ID的View
Data Binding 有效降低了代码的冗余性,甚至完全没有必要再去获取一个 View 实例,万一我们真的就需要的时候,只要给 View 定义一个 ID,Data Binding 就会为我们生成一个对应的 final 变量
1 | <layout xmlns:android="http://schemas.android.com/apk/res/android"> |
Data Binding会自动生成成员变量:
1 | public final TextView firstName; |
这样我们通过binding对象,可以直接访问这些View, 如此之方便
List View Item
1 | @Override |
Includes
有时候我们为了避免layout的xml写得过长,有一些共用的View会抽出来,通过include的方式加入xml中,Data Binding也支持include binding, 我们如何传递binding给include layout呢? 通过Application命名空间 bind:
和变量名@{...}
1 | <?xml version="1.0" encoding="utf-8"?> |
空指针安全
Data Binding自动会检查空对象并且避免空指针异常,例如:在表达式:@{user.name}
中,如果user
是null, user.name
会被指定一个默认值null
, 如果我们用@{user.age}
, 这个地方age是int型,那么当user为null的时候,user.age
默认是0
Collections
常用集合类型,Data Binding都支持:arrays, lists, sparse lists, and maps
1 | <data> |
[备注]
这边大家注意:在xml中<
是特殊字符,当引用List, Map…时,左尖括号需要用转义字符<
替换, 同时,引号"
要用"
替换
表达式
Data Binding支持常用表达式:
- Mathematical + - / * %
- String concatenation +
- Logical && ||
- Binary & | ^
- Unary + - ! ~
- Shift >> >>> <<
- Comparison == > < >= <=
- instanceof
- Grouping ()
- Literals - character, String, numeric, null
- Cast
- Method calls
- Field access
- Array access []
- Ternary operator ?:
前景和展望
- 目前Android Databinding还只支持单向绑定,试想未来是否能像Angular.Js一样支持双向绑定呢?
- 由于目前Android Data Binding还是测试版,buck官方说等Android Databinding升级到正式版本后才考虑对其支持
我谷歌大法一直在与时俱进,每年的I/O大会都会给出重量级的产品,期待上述两个Features的实现,如果真是这样的话,Android不管是开发速度还是编译速度都飞速提高😀