0%

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 nameapplicationId应该是不冲突的,但是还是处于安全问题查看了官网描述

在官网中有提到,package属性只有两种作用:

  • 它将此名称用作应用生成的R.java类的命名空间。

    示例:对于上面的清单,R 类将为 com.example.myapp.R

  • 它会使用此名称解析清单文件中声明的任何相关类名。

    示例:对于上面的清单,声明为 <activity android:name=".MainActivity"> 的 Activity 将解析为 com.example.myapp.MainActivity

并且构建系统利用原始值(设置 R 类的命名空间并解析清单类名称)后,它会舍弃该值并将其替换为应用 ID。即最终的app包名会和applicationId保持一致。