DataBinding的使用都是固定的规则和格式,不存在多少可变的地方,所以主要采用文字进行描述,然后展示示例;如果在过程中遇到了一些问题,可以先跳转到下方查看目前还存在的问题.

官方文档可以查看 : Data Binding Library

DataBinding的使用

在编写代码之前,需要在module的build.gradle中android节点下开启dataBinding插件

android {
    ....
    dataBinding {
        enabled = true
    }
}

使用DataBinding,在Activity中不再使用setContentView()而是DataBindingUtil.setContentView(context, layoutId);将特殊的activity的xml文件进行绑定;
也可以使用DataBindingUtil.inflate(inflater,layoutId,viewgroup, attachToParent);方法获取绑定对象;

上面2个方法的返回值是由框架生成的一个类,生成类的名称如果未在xml文件中主动声明是xml文件名称去掉下划线后进行驼峰命名加上Binding;比如:activity_main.xml生成的类名为ActivityMainBinding.

1.xml文件的编写

  1. 在布局的xml文件中,根节点需要使用layout节点,并且节点上的属性除了命名空间其他都不能添加.


  2. 在layout节点中,编写data节点,data节点除了使用class属性声明生成的类的名称以外不能添加其他属性,class的属性支持3种方式:
    1. 全包名 + 类名 : 框架生成的类将在你的指定的全包名位置
    2. .类名 : 框架生成的类将会存在你的包的根目录下
    3. 类名 : 框架生成的类将会存在你的包的根目录下的databinding文件夹中
      声明之后在代码中进行导包会导入指定位置的类,生成的类和R文件一样存放在在build中.


  3. 在data节点下使用variable节点的type属性声明类型,name声明变量名;
    1. type节点的内容和在代码中一样:除了java.lang下的不需要导包,其他都需要进行导包,导包是在data节点下使用import节点的type属性进行声明,当然也可以在type中写入全包名+类名
    2. 如果指定的类型要添加泛型,泛型的包裹需要使用xml的转义符包裹,不过还是会显示红色的错误,但是可以正常运行.
    3. 声明数组时也会显示红色错误,正常运行


  4. 在layout节点下编写控件节点,需要注意的是所有控件必须在一个根节点下,否则会报错,即layout节点下只允许有2个子节点:一个data节点,一个控件的根节点.
    1. 在控件中的属性如果需要使用data节点中声明的对象,使用的格式为 @{对象名}或@{对象名.变量名}
    2. 如果是List集合为:@{索引},
    3. 如果是map集合为: @{key} 字符串需要使用`(数字键1左边的按键)来包裹,使用指定字符串获取value,或 @{变量名}使用变量的值作为key获取value


DataBinding目前还存在的问题

  1. 编写xml文件后自动生成类不够及时,有时还需要Make Project或Rebuild Project一下才生成,添加variable后回到代码中也是同样的情况.
  2. 有时代码编写错误时IDE显示的报错位置不是真正错的
  3. 在variable节点的type属性中声明泛型使用转义符后还是显示红色的错误,声明数组时也会显示红色错误,不过都可以正常运行
  4. 使用@BindingAdapter注解时,按照官方文档中后面跟着的参数格式({“bind:xxx”, “bind:xxxx”})有bind时会抛出一个警告,去掉bind后无警告并且正常运行