Jetpack的Databinding使用
前言
在一个多模块开发的Android项目中引入了databinding ,踩到了一些坑。这篇文章会将项目中使用databinding的心得以及踩到的坑整理下来。
基本使用
databinding的基本使用在官网已经非常清楚了,可以在这里官网地址查看基本的引入与使用。
在layout中支持如下运算符:
- 算术运算符
+ - / * % - 字符串连接运算符
+ - 逻辑运算符
&& || - 二元运算符
& | ^ - 一元运算符
+ - ! ~ - 移位运算符
>> >>> << - 比较运算符
== > < >= <=(请注意,<需要转义为<) instanceof- 分组运算符
() - 字面量运算符 - 字符、字符串、数字、
null - 类型转换
- 方法调用
- 字段访问
- 数组访问
[] - 三元运算符
?:
如果需要引入某个class,可使用
如果需要在layout中计算表达式,导致没法实时预览效果,可以给default值用以开发预览。
生成的绑定类
系统在默认情况下会为layout文件生成一个绑定类,绑定类位于模块包下的databinding包中,可以自定义data元素的class特性来修改。
在多模块的项目中,databinding会在不同的模块的包路径下面生成DataBinderMapperImpl这样的一个类,用以标示模块下面的databinding class的对应关系。
坑
- 在多模块的Android项目中,即使模块不直接使用数据绑定,也必须为依赖于使用数据绑定的库的所有模块启用数据绑定
- 由于会在多模块下生成固定的以包名为路径的class,所以当两个module的package name相同的时候,会出现duplicate class的报错。可以通过修改package name来避免两个module出现重复类
其他
在修改package name的时候,被别人挑战了下是否会修改最后应用的包名。本来印象里package name和applicationId应该是不冲突的,但是还是处于安全问题查看了官网描述。
在官网中有提到,package属性只有两种作用:
它将此名称用作应用生成的
R.java类的命名空间。示例:对于上面的清单,
R类将为com.example.myapp.R。它会使用此名称解析清单文件中声明的任何相关类名。
示例:对于上面的清单,声明为
<activity android:name=".MainActivity">的 Activity 将解析为com.example.myapp.MainActivity。
并且构建系统利用原始值(设置 R 类的命名空间并解析清单类名称)后,它会舍弃该值并将其替换为应用 ID。即最终的app包名会和applicationId保持一致。