Data Binding

Data BindingAndroid待发布的支持库,它可以将逻辑和代码关联起来,避免开发者书写大量的胶合代码。

此前,布局文件XML被认为是相对静态的,往往需要在Java代码中处理与其有关的逻辑;数据绑定技术(Data Binding)改造了布局文件使其能够导入Java类,定义和使用变量,具备像Java代码一样的灵活性,从而使得XML文件变的更加动态化,支持更强大的功能。

添加依赖

在项目顶层的gradle中添加依赖

dependencies {
    classpath "com.android.tools.build:gradle:1.2.3"
    classpath "com.android.databinding:dataBinder:1.0-rc0"
}

在具体模块gradle配置文件中启用该插件

apply plugin: ‘com.android.databinding‘

使用示例

现在有一个User

public class User {
   public final String firstName;
   public final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
}

考虑一个专门用来显示User全名TextView,使用数据绑定可以在layout布局文件中就指定其显示的内容为User对象的全名。这个布局文件databinding_layout.xml如下

//1.根标签为 layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    //2.data标签定义所使用数据域对象
    <data>
        //3.variable标签根据Java类建立变量
        <variable
            name="user" //声明变量名称
            type="com.example.migratingtest.User" //指定变量类型
        />
    </data>
    //4.静态布局
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_margin="20dp"
            android:padding="20dp"
            android:background="#55ffff00"
            //5.用@{user.firstName}格式使用定义的类对象user
            android:text="@{user.firstName}[email protected]{user.getLastName()}"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

</layout>

布局文件中定义了对象usertextview的对应关系,但要传入的对象user还需要在Java代码中生成;同时这个布局文件将按名称生成一个DatabindingLayoutBinding类,位于app\build\intermediates\classes\debug\<包名>\databinding目录下,需要在Java代码中作为布局载入;而后将二者绑定起来。

//1.载入新布局类
DatabindingLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.databinding_layout);
//2.产生User对象
User user = new User("liu", "xiangtian");
//3.绑定布局和具体对象
binding.setUser(user);

更多用法

布局文件中data可以像Java代码一样导入类,并直接使用其类静态变量/方法,使用variable标签声明和建立对象;

类和对象的域/方法均可以在布局文件中使用,也支持相关运算,如上例中的字符连接符+

观察者模式

上述仅是数据绑定的基本功能,如果User对象一被改变,布局界面就自动更新,数据绑定才显得名副其实。其实现很容易让人联想到观察者模式,User对象继承Observable作为被观察者,但问题是这种实现更新需要主动使用notify函数来通知观察者们;为此,android使用BaseObservable类和Bindable注解实现自动通知。

要改的仅仅是User类。

//1.继承BaseObservable类成为被观察者
public class User extends BaseObservable{
    public String firstName;

    //2.给get方法Bindable注解
    @Bindable
    public String getFirstName() {
        return firstName;
    }
    //3.给set方法添加`notify`方法
    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }

}

BR亦是编译时生成类,同样位于app\build\intermediates\classes\debug\<包名>\目录下,其内容是:

public class BR {
    public static final int _all = 0;
    public static final int firstName = 1;
    public static final int lastName = 2;
    public static final int user = 3;
}

此后当使用user.setFirstName("li")更改数据后,布局中将相应变化。

BR代码可知,User类中所有域均被编入被观察者列表中,这有时并不合理。为了灵活起见,可以使用ObservableFields单独对某个引用域进行转换,使用ObservableInt等对基本类型进行转换。

依然改User

public class User {
    public ObservableField<String> firstName = new ObservableField<>();
    public ObservableField<String> lastName = new ObservableField<>();
}

在Java代码中初始化User

User user = new User();
//ObservableField是一个包装类,提供get/set方法处理包装的内容对象
user.firstName.set("liu");
user.lastName.set("xiangtian");

布局文件仍然使用@{user.firstName}即可,不需要使用@{user.firstName.get}

绑定关系类

生成的新布局文件是一个代表绑定关系的类DatabindingLayoutBinding,这个类继承自ViewDataBinding,其中包含所有在布局中声明了的类对象 和 参与绑定的全部View,并提供了相应了set/get方法以及解除所有绑定的unbind方法。如示例中

全选复制放进笔记

// views
private final android.widget.LinearLayout mboundView0;
private final android.widget.TextView mboundView1;
// variables
private com.example.migratingtest.User mUser;

原文:http://segmentfault.com/a/1190000004014681
时间: 2024-10-10 06:55:06

Data Binding的相关文章

Data Binding Library(数据绑定库)

引子 上图中有一些 TextView 和 Button 等,正常情况下,互联网APP都会从服务器抓取数值,然后在 Activity中 findViewById 再进行setText等等.这篇文章就是用来解放你的双手劳动力 的,使用数据绑定库可以不用去findView不用在写繁琐的 setText,只要从服务器获取json 转换成 javaBean格式然后 set,duang,,,,, 所有的值就自己展现在该有的地方了. Demo: https://github.com/Afra55/DataBi

WPF QuickStart系列之数据绑定(Data Binding)

这篇博客将展示WPF DataBinding的内容. 首先看一下WPF Data Binding的概览, Binding Source可以是任意的CLR对象,或者XML文件等,Binding Target需要有依赖属性.这样便可以进行Data Binding.请看下面的示例, C# public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new Pe

告别findViewById(),ButterKnife,使用Google Data Binding Library(1)

Data Binding Library 用数据绑定编写声名性布局,可以最大限度的减少findViewById(),setOnClickListener()之类的代码.并且比起findViewById(),所有view是一次性初始化完成,性能更快. Data Binding Library具有灵活性和不错的兼容性,支持2.1以后的版本. 需要 Android Plugin for Gradle 1.5.0-alpha1或以上版本. 至于怎么升级? https://developer.androi

Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的人,但事实并非如此,例如我.好在闷着头看了一遍,又查资料又敲代码,总算明白了. 其实说穿了一文不值,我们用一个例子来解释: 假定,现有一个app,功能是接收你输入的生日,然后显示你的年龄.看起来app只要用当前日期减去你输入的日期就是年龄,应该很简单对吧?可惜事实不是这样的. 这里面有三个问题: 问题一:我们输入的永远是字符串,字符串需要转成日期格式才能被我们的ap

Android Data Binding 技术

Android Data Binding 技术

Android Data Binding Library 官方文档(译)

地址:https://developer.android.google.cn/topic/libraries/data-binding/index.html 本文地址:http://blog.csdn.net/jjwwmlp456/article/details/54915981 Data Binding Library (数据绑定库),旨在减少绑定应用程序逻辑和布局所需的一些耦合性代码 最低支持Android 2.1 (API Level 7) 构建环境 使用gradle插件1.5-alpha

WPF data binding

Binding这个类包含以下几个常用的属性: ElementName: Gets or sets the name of the elements to use as the binding source object. [Default is null] Source: Gets or sets the object to use as the binding source. RelativeSource: Gets or sets the binding source by specifyi

WP8.1 Study5:Data binding数据绑定

一.数据绑定 最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样的代码很快就会变得笨拙,容易出错 因此,为了更加方便,使用XAML数据绑定到你的UI链接到一个在应用程序中包含应用程序的数据的类. 这个类class:是一个对于被称为视图模型的数据绑定(ViewModel)的数据源. UI控件可以从视图模型Viewmodel类的属性自动获取其显示值,而且通过改变Viewmod

[WPF]如何调试Data Binding

前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题.这篇博客将介绍WPF Data Binding调试相关的内容. 场景一(Binding的属性不存在) ViewModel: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.DataContext = new ViewMo

Android Data Binding语法解析(二)

上篇我们知道了Data Binding的最简单的用法,那么Data Binding其中最为重要也是最复杂的其实就是在xml布局文件中给对应的控件进行数据绑定了,接下来就一一说明Data Binding的使用各个场景的语法. 我们以User类这个Model为例: public class User { private String userName; private String userPassword; private boolean isExist; public String getUse