揭秘Android 6.0 之 Data Binding Guide(数据绑定指南)
前言:Data Binding解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性。其实在此之前,已经有些第三方的框架(RoboAndroid)可以支持 MVVM 模型,无奈由于框架的侵入性太强,导致一直没有流行起来。
1、准备: AndroidStudio 更新到1.3或者更高 2、注意: DataBinding 是一个 support 包 3、新建一个Project: >>修改Project的Build.gradle,为 buildscript 添加一条依赖。 classpath "com.android.databinding:dataBinder:1.0-rc1" >>为用到 Data Binding 的模块添加插件,修改对应的 build.gradle applyplugin: 'com.android.databinding' 工程创建完成后,我们通过一个最简单的例子来说明 Data Binding 的基本用法。
一、布局文件 使用 Data Binding 之后,xml的布局文件就不再单纯地展示UI 元素。所以,它的根节点不再是一个 ViewGroup,而是变成了 layout,并且新增了一个节点 data,如例1-1所示: 例1-1 - <?xml version="1.0" encoding="utf-8"?>
- <layout xmlns:android="http://schemas.android.com/apk/res/android">
- <data>
- <import type="com.example.siyan.sample.Person" />
- <variable
- name="user"
- type="Person" />
- </data>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{user.name}"
- android:textSize="20sp" />
- </LinearLayout>
- </layout>
复制代码 在Layout中data节点,声明一个variablea子节点,然后就可以在Layout中使用了。Type属性可以是JavaBean、POJO(实际就是Java类),注意:Type应该是全路径。name属性为这个类的引用起的一个别名。如例1-2: 例1-2 - <data>
- <variable
- name="user"
- type="com.example.siyan.sample.Person" />
- </data>
复制代码 当然,还可以使用下面这一种写法。如例1-3: 例1-3 - <data>
- <import type="com.example.siyan.sample.Person" />
- <variable
- name="user"
- type="Person" />
- </data>
复制代码 布局里面使用表达式"@{}"设置object的value。如例1-4: 例1-4 - <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@{user.name}" />
复制代码 数据对象POJO。如例1-5: 例1-5 - public class Person {
- public final String name;
- public Person(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- }
复制代码
二、绑定数据用DatabindingUtil.setContentView() 来替换掉 setContentView(),然后创建一个 user 对象,通过 binding.setUser(user) 与 variable 进行绑定如例2-1: 例2-1 - <font size="3">protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //注意AMainBinding 是根据布局名字怎么生成的
- AMainBinding dataBinding = DataBindingUtil.setContentView(this, R.layout.a_main);
- Person p = new Person("传智播客");
- dataBinding.setUser(p);
- }</font>
复制代码 AMainBinding类是自动生成的,所有的set 方法也是根据 variable节点的name属性生成的。 至此,一个简单的数据绑定就完成了。运行上述程序,效果如图所示:
|