DataBinding的使用和当前版本还存在的问题总结
CommentDataBinding的使用都是固定的规则和格式,不存在多少可变的地方,所以主要采用文字进行描述,然后展示示例;如果在过程中遇到了一些问题,可以先跳转到下方查看目前还存在的问题.
官方文档可以查看 : 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文件的编写
- 在布局的xml文件中,根节点需要使用layout节点,并且节点上的属性除了命名空间其他都不能添加.
- 在layout节点中,编写data节点,data节点除了使用class属性声明生成的类的名称以外不能添加其他属性,class的属性支持3种方式:
- 全包名 + 类名 : 框架生成的类将在你的指定的全包名位置
- .类名 : 框架生成的类将会存在你的包的根目录下
- 类名 : 框架生成的类将会存在你的包的根目录下的databinding文件夹中
声明之后在代码中进行导包会导入指定位置的类,生成的类和R文件一样存放在在build中.
- 在data节点下使用variable节点的type属性声明类型,name声明变量名;
- type节点的内容和在代码中一样:除了java.lang下的不需要导包,其他都需要进行导包,导包是在data节点下使用import节点的type属性进行声明,当然也可以在type中写入全包名+类名
- 如果指定的类型要添加泛型,泛型的包裹需要使用xml的转义符包裹,不过还是会显示红色的错误,但是可以正常运行.
- 声明数组时也会显示红色错误,正常运行
- 在layout节点下编写控件节点,需要注意的是所有控件必须在一个根节点下,否则会报错,即layout节点下只允许有2个子节点:一个data节点,一个控件的根节点.
- 在控件中的属性如果需要使用data节点中声明的对象,使用的格式为 @{对象名}或@{对象名.变量名}
- 如果是List集合为:@{索引},
- 如果是map集合为: @{
key
} 字符串需要使用`(数字键1左边的按键)来包裹,使用指定字符串获取value,或 @{变量名}使用变量的值作为key获取value
DataBinding目前还存在的问题
- 编写xml文件后自动生成类不够及时,有时还需要Make Project或Rebuild Project一下才生成,添加variable后回到代码中也是同样的情况.
- 有时代码编写错误时IDE显示的报错位置不是真正错的
- 在variable节点的type属性中声明泛型使用转义符后还是显示红色的错误,声明数组时也会显示红色错误,不过都可以正常运行
- 使用@BindingAdapter注解时,按照官方文档中后面跟着的参数格式({“bind:xxx”, “bind:xxxx”})有bind时会抛出一个警告,去掉bind后无警告并且正常运行