前言
在一个多模块开发的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
保持一致。