目录
一、环境搭建
Data Binding 插件需要Gradle 1.3以上及Android Studio 1.3.
在app目录下的build.gradle文件下android结构中添加下面的语句
dataBinding {
enabled true
}
二、MVVM架构
1) 角色
-
View:
对应于Activity和XML,负责View的绘制以及与用户交互 -
Model
实体模型 -
ViewModel
负责完成View与Model间的交互,负责业务逻辑
2) 数据驱动
在常规的开发模式中,数据变化需要更新UI的时候,需要先获取UI控件的引用,然后再更新UI。获取用户的输入和操作也需要通过UI控件的引用。在MVVM中,这些都是通过数据驱动来自动完成的,数据变化后会自动更新UI,UI的改变也能自动反馈到数据层,数据成为主导因素。这样MVVM层在业务逻辑处理中只要关心数据,不需要直接和UI打交道,在业务处理过程中简单方便很多
3) 角色区分
MVVM是一种架构模式,而DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个工具
三、优点
-
有可重用性
你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
在Android中,布局里可以进行一个视图逻辑,并且Model发生变化,View也随着发生变化 -
低耦合
以前Activity、Fragment中需要把数据填充到View,还要进行一些视图逻辑。现在这些都可在布局中完成
甚至都不需要再Activity、Fragment去findViewById。这时候Activity、Fragment只需要做好的逻辑处理就可以了。
四、DataBinding支持的表达式
- 数学表达式: + - / * %
- 字符串拼接 +
- 逻辑表达式 && ||
- 位操作符 & | ^
- 一元操作符 + - ! ~
- 位移操作符 >> >>> <<
- 比较操作符 == > < >= <=
- instanceof
- 分组操作符 ()
- 字面量 - character, String, numeric, null
- 强转、方法调用
- 数组访问 []
- 三元操作符 ?
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
支持dimen,还支持color、string、drawable、anim等 - 聚合判断(Null Coalescing Operator)语法 ‘??’
android:text="@{user.userName ?? user.realName}"
上面的意思是如果userName为null,则显示realName。 - 字符拼接
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{`username is :`+user.username}"/>
这里的字符拼接不是用单引号哦,用的是ESC按键下面那个按键按出来的。目前DataBinding中的字符拼接还不支持中文
- 官方手册
https://developer.android.com/tools/data-binding/guide.html
五、MVVM用法
1. 模板写法
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<!--此处定义该布局要用到的数据的名称及类型-->
</data>
<!--此处按照常规方式定义要使用的布局,其中可以使用binding表达式代表属性值,所谓binding表达式,指形如"@{user.firstName}"的表达式-->
</layout>
2. 自定义Binding类名(Custom Binding Class Names)
-
以为根节点布局,android studio默认会自动产生一个Binding类。类名为根据布局名产生,如一个名为activity_simple的布局,它的Binding类为ActivitySimpleBinding,所在包为app_package/databinding。
-
当然也可以自定义Binding类的名称和包名
<data class="CustomBinding"></data> 在app_package/databinding下生成CustomBinding;
<data class=".CustomBinding"></data> 在app_package下生成CustomBinding;
<data class="com.example.CustomBinding"></data> 明确指定包名和类名。
3. Layout布局中Includes 标签使用
<include layout="@layout/name"
bind:user="@{user}"/>
4. BaseObservable的方式
- 使User继承BaseObservable,在get方法上加上注解@Bindable,会在BR(BR类自动生成的)生成该字段标识(int)
set方法里notifyPropertyChanged(BR.field);
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}