本篇来自 带心情去旅行 的投稿。正所谓鱼与熊掌不可兼得,本文详尽分析的同时也伴随着略长的篇幅,但是我相信大家一定可以有耐心地读下去,因为内容由浅入深,环环相扣,十分充实。
带心情去旅行 的博客地址:
http://www.jianshu.com/users/769d3d3a9d4b
说到 DataBinding,就有必要先提起 MVVM设计模式。
Model–View–ViewModel(MVVM) 是一个软件架构设计模式,相比 MVVM,大家对 MVC 或 MVP 可能会更加熟悉。
MVC:(VIew-Model-Controller)
早期将 View、Model、Controller 代码块进行划分,使得程序大部分分离,降低耦合。
MVP:(VIew-Model-Presenter)
由于 MVC 中 View和Model之间的依赖太强,导致 Activity 中的代码过于臃肿。为了他们可以绝对独立的存在,慢慢演化出了 MVP。在 MVP 中 View 并不直接使用 Model,它们之间的通信是通过 Presenter (MVC中的Controller) 来进行的。
MVVM:(Model–View–ViewModel)
MVVM 可以算是 MVP的升级版,将 Presenter 改名为 ViewModel。关键在于 View和Model的双向绑定,当 View 有用户输入后,ViewModel 通知 Model 更新数据,同理 Model 数据更新后,ViewModel 通知 View 更新。
在Google I/O 2015上,伴随着 Android M 预览版发布了Data Binding兼容函数库:
https://developer.android.com/tools/data-binding/guide.html
不知道要扯什么了,还是直接上代码,来看看 Data Binding 的魅力吧。
环境要求
Data Binding 对使用的环境还是有一定要求的(这货有点挑):
Android Studio 版本在 1.3以上
Gradle 的版本要在 1.5.0-alpha1 以上
需要在 Android SDK manager 中下载 Android Support repository
然后在对应的 Module 的 build.gradle 中添加:
android {
....
dataBinding {
enabled =true
}
}
Gradle需要升级版本的可以参考:
升级Gradle版本
http://www.jianshu.com/p/00beddbe3dbc
创建对象
创建一个 User类:
布局
在 activity_main.xml 中布局:
这里跟平时的布局有点不同,最外层是 layout,里面分别是 data 以及 我们的布局。
data:声明了需要用到的 user对象,type 用于指定路径。
可以在 TextView 中的看到 android:text="@{user.firstName}", 这是什么鬼,没见过这么写的!!!(不急,继续往下看)
绑定数据
看看下面的 MainActivity:
问我 ActivityMainBinding 哪来的?我怎么知道...
ActivityMainBinding 是根据布局文件的名字生成的,在后面加了 Binding。
运行下看看效果吧:
有点懵逼了,就绑定了下而已,这些数据是怎么显示到界面上的。
他是怎么工作的?
原来 Data Binding 在程序代码正在编译的时候,找到所有它需要的信息。然后通过语法来解析这些表达式,最后生成一个类。
通过反编译我们可以看到,反编译可以参考这里:
http://blog.csdn.net/vipzjyno1/article/details/21039349
Data Binding 为我们生成了 databinding包,以及 ActivityMainBinding类:
看看我们在 onCreate 中最后调用的 binding.setUser(user),在 ActivityMainBinding 中可以看到这个方法:
我想就是这个 super.requestRebind() 对数据进行了绑定,至于里面怎么实现的,有待进一步研究。
上面只是用一个简单的例子,展示了 Data Binding 的用法,如果想在实际项目中使用,可不是上面这例子可以搞定的。下面就来说说 Data Bindig 的更多用法。