DataBinding使用教程(一):配置与基本使用
配置DataBinding
开启DataBinding功能很简单,只需要在APP的gradle中按如下方式配置即可:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
配置好之后记得同步一下项目,就可以使用DataBinding的方式开发了。
DataBinding的基本使用
使用步骤:
- 在默认的布局文件的最外层嵌套一对标签
- 把
xmlns:android="http://schemas.android.com/apk/res/android"
移到layout标签中
xmlns:app="http://schemas.android.com/apk/res-auto" - 在对应的activity中使用DataBindingUtil类的setContentView()方法替 换原有的setContentView()方法
示例代码如下:
默认布局文件:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
修改为dataBinding方式的布局文件:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
默认activity中的代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
修改为dataBinding方式后activity中的代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
以上就是DataBinding的基本使用。
使用DataBinding的优点
通过上面的简单示例代码我们可以很明显的看到使用DataBinding的简洁之处。
- 再也不需要编写findViewById了
这种简化的优势当需要初始化的控件多了之后会更加明显,并且这仅仅是DataBinding众多优点之中的一个而已,后续文章中我会带着大家体验DataBinding更多的优点。
对可能产生的疑惑的解释
1. 为什么配置了 dataBinding{enabled = true}之后就可以使用dataBinding方式进行开发了?
我们知道,在Android Studio中是依靠gradle来管理项目的,在创建一个项目时,从开始创建一直到创建完毕,整个过程是需要执行很多个gradle task的,这些task有很多是系统预先帮我们定义好的,比如build task,clean task等,DataBinding相关的task也是系统预先帮我们定义好的,但是默认情况下,DataBinding相关的task在task列表中是没有的,因为我们没有开启dataBinding,但是一旦我们通过 dataBinding{enabled = true}的方式开启DataBinding之后,DataBinding相关的task就会出现在task列表中,每当我们执行编译之类的操作时,就会执行这些dataBinding Task, 这些task的作用就是检查并生成相关dataBinding代码,比如dataBindingExportBuildInfoDebug这个task就是用来导出debug模式下的build信息的。
项目中所有的task列表可以从Android Studio面板右侧贴边的Gradle中找到。
2. ActivityMainBinding这个类从哪来的?
通过第一个问题的解释,我们也就知道了ActivityMainBinding这个类其实是系统帮我们自动生成的。
但是如果你在实际编写代码的过程中,你会发现并没有执行编译、运行之类等操作,ActivityMainBinding这个类就直接能用了,竟然还有这种操作?其实是Android Studio 这个IDE自动帮我们做了这一步,在默认情况下,系统会使用Android Studio为我们自动生成databinding相关的代码,但是这种方式生成的代码不能调试,如果你想通过点击ActivityMainBinding跳转到它的源码中,你会发现并不能如你所愿,而是会跳转到对应的布局文件中。那么如果我们确实要查看ActivityMainBinding的源码并且还想调试,我们就需要通过另外一种方式:手动编译代码。这两种方式可以通过Android Studio的设置面板修改。
3.Android Studio为什么有能力生成DataBinding相关代码
根据第2个问题的解释,我们知道Android Studio可以自动生成DataBinding相关代码。
在以前,如果我们想使用dataBinding方式开发,还需要引入dataBinding的相关Library,但是现在我们不用引入这些library了,因为在我们配置完dataBinding{enabled = true}之后,系统会自动引入这些library,但是这些library的源码在哪里放着呢?我们可以找到Android Studio的安装路径,在
\plugins\android\lib
路径下找到data-binding.jar,比如我的路径则为:D:\Android\AndroidStudio\plugins\android\lib
,这个jar包中存放的就是DataBinding相关的源码,包括annotationprocessor,parser,tool,以及相关注解和类,这个源码就是让Android Studio有能力生成DataBinding相关代码的原因。
但是我们发现这些源码都已经被编译为class文件,想查看真正的源码还想看到对应的注释通过这个源码是不可能了。我们可以通过这个地址DataBinding的java源码地址 查询和下载DataBinding各个版本的源码和Javadoc。
4.DataBinding与ButterKnife的区别和联系
ButterKnife很多人都用过,在以前的findViewById的时代,我们厌烦了写这些重复的代码,当有了ButterKnife之后,我们采用注解的方式来查找控件和注册监听,配合ButterKnife的插件,大大提升了我们的开发效率,一度成为开发神器,但是有了DataBinding之后,你会发现使用ButterKnife开发还是不够简洁:比如要获取editText的内容前必须要获取editText对象,给view添加监听前也必须要获取这个view对象等等。但是使用了DataBinding之后,这些冗余的代码统统都可以得到简化。
5.那么问题来了,既然DataBinding这么666,为什么目前看来好像并没有火起来呢?毕竟dataBinding也发布好多年了。
这个问题我也只能发表我个人的见解,不合适之处还请见谅和指出:虽然DataBinding已经推出了好几年,但是在初期DataBinding存在很多bug,会导致项目不稳定,写个demo还可以,但是应用到企业开发中的确要慎之又慎;后来随着DataBinding的发展,bug逐渐修复,但是IDE却始终跟不上脚步,导致DataBinding的一些错误很难得到定位,开发调试很困难;但是近段时间以来,随着IDE对DataBinding支持的加强,开发和调试也变得容易很多,感觉DataBinding的春天要到来了,但是好像还是没有太火起来,那到底是什么原因限制了DataBinding的发展呢?
其实,归根结底还是开发方式的转变让很多开发者一时无法接受,因为之前都是在java代码中与数据打交道,但是使用了DataBinding之后,数据直接和xml布局文件打交道了,这造成了布局文件与数据的高度耦合:一个布局文件只能展示某一个实体类的数据,如果想展示其他实体类的数据,很难做到,除非把布局代码重新拷一份然后更改实体类。这样高度耦合的缺点在更改包名时会更加严重。因为所有生成的dataBinding相关代码都存储在当前项目包名目录下的,并且我们在xml布局文件中引入也会引入一些当前包名的相关类,当更改包名时,Android Studio有时并不会检索到所有需要更改包名的地方,在这种情况下,一旦更改包名,等待我们的将是挨个找到被自动没有更改包名的类,然后我们手动修改,这个过程我想没人会高兴吧。
那还要使用DataBinding吗?
肯定要使用啊,开玩笑,不然写这个系列的文章搞毛啊!虽然更改包名的时候很烦,但是我们基本不会发生次次改包名的情况吧。即便更改包名很蛋疼,但相对于在编写代码时的爽快来说,个人认为还是不算什么的。毕竟使用dataBinding开发真的是很爽,可以少写N多代码,让我们的代码真的只专于业务。