Data Binding Library

数据绑定, 更简单的方式给View赋值和刷新;

软件环境:

android版本: 兼容Android 2.1以上(API level 7+);
Gradle版本: 1.5.0-alpha1 以上;
Android Studio版本: 1.3以上;

配置

app model里的 build.gradle 添加;

如果程序使用的library项目里有data binding, app model 也还是要像上面这样配置;

正文


data(填充的数据)

给View提供数据;

Observable

通知更新;
BaseObservable,ObservableInt,ObservableFloat,ObservableBoolean,ObservableField;

@Bindable 修饰的布尔值不要用 is 开头


布局文件

  • 使用 layout 作为根标签,layout 里只有两个子标签,一个 data 另一个是布局;
  • 将原有的布局放在layout标签内;
  • data 标签设置数据

data标签

java.lang.* 包中的类会被自动导入,可以直接使用,不需要显式import;
data 标签内可以使用:

  • import 导入类,既可以是系统的,也可以是自己的
    • type属性: 指定该类的路径
    • alias属性:导入多个包,如果类名有重复, 可用这个定义 别名
  • variable 声明一个数据对象
    • type属性: 路径
    • name属性: 变量名

@{ }句法

使用@{},{}里的值给属性赋值, {}里放表达式求值或一个由data对象提供的数据;

  • ??: ?? 前面的值为空,就使用??后面的值;@{user.name ?? user.age}
  • {}里可以直接使用资源(@dimen/…)
  • {} 可以使用一些运算符
xml 布局文件中部分符号需要转义

控件使用id

一般流程给控件添加id后, 在java代码中通过 "ViewDataBinding 对象.id值" 访问对象;

activitydatabind.xml


java代码中数据绑定

ViewDataBinding

1: 使用了 DataBind 的布局会自动生成ViewDataBinding的继承类,继承类命名以"布局名称+Binding";
2:会根据布局中data标签里的variable标签的name属性生成一个set方法。类对象调用set方法绑定数据;

activity中使用的例子

使用 DataBindingUtil.setContentView 方法替代 setContentView 方法;

在RecycleView里使用

在 item 的布局里添加 data 标签;
把 DataBinding 的一个实例放到 ViewHolder里, 在onCreateViewHolder里存入, 在onBindViewHolder时赋值data.

Custom Setters

使用自定义方法, 接收xml中控件属性里的值;
使用@BindingAdapter注解, ()里放置需要的属性, 多个属性放在{}里;
第一个参数是view;下面的参数和注解里的一致(个数以及出现顺序);
@BindingAdapter 修饰的这个方法可以写在任意位置, 编译时自动处理;

布局中的控件要同时有需要的属性, 上面的就是 app:imageUrl 和 app:error 同时需要;
且imageUrl是String, error是Drawable;
BindingAdapter里的属性可以不带 android, app,这些前缀;

Renamed Setters(重命名setter)

修改某个属性对应的setter名字, 使这个属性名更好理解, 不常用;

也可用于增加属性(给 Button 增加 selected 属性)

1: 在 ttrs.xml 中添加 select 属性

2: 在布局中使用

3: java 文件中定义转换

Custom Conversions(自定义转换)

使用@BindingConversion修饰自定义转换方法;
一般情况下会根据提供的类型和需要的类型进行自动转换;

这里的background需要Drawable类型, @{}返回的是int类型, 这个时候就发生了转换;

默认值

default=
默认显示文本

遇到的报错

如果项目中有其它错误, 导致 build 失败, 所以框架生成的文件都将找不到
不同的数据绑定类中,建议使用不同的变量名
布局绑定的对象里如果有布尔类型的属性, 不要使用 is 开头的变量名

参考资料

  • https://developer.android.com/topic/libraries/data-binding/index.html
  • https://github.com/LyndonChin/MasteringAndroidDataBinding
  • https://realm.io/news/data-binding-android-boyar-mount/
0 Comments
Leave a Reply