DataBinding在xml中数据绑定支持的语法表达式也是非常丰富的,支付在布局文件中使用一下运算符、表达式和关键字:
- 算术运算符:+ - * / %;
- 字符串连接运算符:+;
- 逻辑运算符:&& ||;
- 二元运算符:& | ^;
- 一元运算符: + - ! ~;
- 位移运算符: >> >>> <<;
- 比较运算符: == > < >= <= (需要被转义);
- 判断是否是类的实例:instanceof;
- 分组运算符:();
- 字面量运算符 - 字符,字符串、数据、null;
- 类型转换、方法调用;
- 字段访问;
- 数组访问: [];
- 三元运算符:?:;
- 不支持以下操作:this super new 显示泛型调用。
4.BataBinding如何扩展View属性
我们知道,以前想要给ImageView增加几个属性,必须要写个自定义的ImageView在构造函数中一顿解析。那看看使用DataBinding如何扩展View属性。
public class HiImageView extends ImageView{
//需要使用BindingAdapter注解并标记在public static方法上。
//value中的字段随意添加和方法参数一一对应即可。
@BindingAdapter(value = {“image_url”, “isCircle”})
public static void setImageUrl(PPImageView view, String imageUrl, boolean isCircle) {
view.setImageUrl(view, imageUrl, isCircle, 0);
}
//requireAll = false代表是否以下三个属性在xml中同时使用才会调用到该方法
//为false的话,只要有一个属性被使用就能调用到该方法
@BindingAdapter(value = {“image_url”, “isCircle”, “radius”}, requireAll = false)
public static void setImageUrl(PPImageView view, String imageUrl, boolean isCircle, int radius) {
…
}
}
//在布局文件中如下使用,便能实现图片圆角和资源Url绑定的功能
<org.devio.as.main.HiImageView
…
app:image_url ="@{user.avatar}"
app:radius="@{50}">
</org.devio.as.main.HiImageView>
5.DataBinding使用的建议
-
如fragment_layout_my.xml布局,在编译时会生成FragmentLayoutMyImpl.java实现类,我们可以搜索这种类debug跟进解决问题。
-
不建议在列表中乱用,因为DataBinding数据绑定是延迟一帧的,如果列表中的ItemView的宽高需要计算后才能正确展示,不建议使用DataBinding操作。否则会看到列表ItemView明显的撑开动画,体验不好。
此处可以使用dataBinding.executePendingBindings()快速渲染布局解决
- 实体类配合BaseObservable可以友好的解决数据双向绑定的问题。
6.ViewBinding又是什么?
Android Studio更新到3.6之后,多了一个ViewBinding的功能,看到这个名字就感觉和DataBinding很相似,那么它们有什么区别呢?
- DataBinding可以将View和界面上的数据进行双向绑定,ViewBinding不行,也就是不能再xml中绑定数据,若要使用则需要在Gradle中开启如下配置:
viewBinding {
enabled = true
}
-
如果你想要实现双向数据绑定,那么可以选择DataBinding;
-
ViewBinding主要是帮我们省却了findViewById的过程,但是它在编译阶段比DataBinding耗时更短;
-
如果你已经使用了Kotlin,那其实ViewBinding就没必要使用了。
7.DataBinding源码分析
布局文件的加载确认
XML分离后XML文件位置
开发者编写的布局
<?xml versio