好长时间不写文章了,最近公司项目中用到了DataBinding,首次接触,就来和大家探讨下...哈哈
1. 为什么要使用DataBinding
1.目前一般情况下,我们在实现UI 界面时,通常都是使用 View.findViewById(); 各种更新 View 属性的 setter:setText(),setVisibility(),setEnabled() 或者 setOnClickListener() 等等这些重复而且没有营养的代码。写的越多,出现bug的几率就越多。
2.有了Databinding 就一样了,我们可以避免写很多“无用”的代码。
3.Databinding 是一个实现数据和UI绑定的框架,是一个实现 MVVM 模式的工具,有了 Data Binding,在Android中也可以很方便的实现MVVM开发模式。
4.使用 Data Binding 会增加编译出的 apk 文件的类数量和方法数量。
新建一个空的工程,统计打开 build.gradle 中 Data Binding 开关前后的 apk 文件中类数量和方法数量,类增加了 120+,方法数增加了 9k+(开启混淆后该数量减少为 3k+)。
如果工程对方法数量很敏感的话,请慎重使用 Data Binding。
2. 如何使用DataBinding
最低需要Android 2.0的环境, Gradle 1.5 alpha 及以上自带支持 DataBinding,仅需在使用 DataBinding 的 module 里面的 build.gradle 里面加上配置即可:
android {
...
dataBinding {
enabled = true
}
...
}复制代码
如果gradle 的版本小于1.5,需要
android {
...
dataBinding {
enabled = true
}
...
}
dependencies{
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.android.databinding:dataBinder:1.0-rc0'
}
为用到 Data Binding 的模块添加插件,修改对应的 build.gradle。
apply plugin: 'com.android.databinding'
复制代码
3.DataBinding 使用场景和表达式
使用场景
- 单纯的摆脱findviewbyid
- 绑定基本数据类型及String
- 绑定Model数据包括imageURL
- 绑定事件
- 通过静态方法转换数据类型
- 通过运算符操作数据
- 自定义Binding的类名
- 绑定相同Model的操作
- model变量改变自动更新数据
- 绑定List/Map等集合数据
- Observable自动更新
- Databinding与include标签的结合
- DataBinding与RecyclerView的结合
表达式
- 数学 + - / * %
- 字符串连接 +
- 逻辑 && ||
- 二进制 & | ^
- 一元运算 + - ! ~
- 移位 >> >>> <<
- 比较 == > < >= <=
- instanceof
- 分组 ()
- null
- Cast
- 方法调用
- 数据访问 []
- 三元运算 ?:
示例:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
复制代码
缺少的操作:
- this
- super
- new
- 显式泛型调用
Null 合并
?? - 左边的对象如果它不是null,选择左边的对象;或者如果它是null,选择右边的对象:
android:text="@{user.displayName ?? user.lastName}"复制代码
避免 NullPointerException
Data Binding代码生成时自动检查是否为null 来避免出现null pointer exceptions错误。例如,在表达式@{user.name}中,如果user是null,user.name会赋予它的默认值(null)。如果你引用user.age,age是int类型,那么它的默认值是0。
4. DataBinding 的简单使用
新建类 Person
public class Person {
private String name;
private String sex;
private String age;
public String getName() {
return name;
}
public Person(String name, String sex, String age) {
this.name = name;
this.sex = sex;
this.age = age;
}
getter setter...
}
复制代码
activity
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setView(this);
Person person = new Person("feng", "girl", 22);
binding.setPerson(person);
复制代码
activity_main.xml
复制代码
<data>
<variable
name="view"
type="com.xiaohong.fengok.MainActivity"/>
<import type="com.xiaohong.fengok.bean.Person"/>
<variable
name="person"
type="Person"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{person.age}"/>
</RelativeLayout></layout>复制代码
复制代码
复制代码