今天要讲的是DataBinding,在Google 2015 IO大会上推出了DataBinding 这个新特性, 它是以一个support库的形式发布,所以可以在所有的Android平台上使用它。但是它对Android Studio 以及Gradle的版本有一定的要求。
Android Studio 至少是1.3.0-beta1 Gradle至少是1.3以上。这个对大家来说应该是没啥大问题吧,如果没有满足这两个条件,大家Google下就可以解决了。
刚开始我们先搭建一个很简单很简单的例子,让大家属性下环境的搭建:

  • 首先检查下gradle版本是否正确,在项目根目录下检查build.gradle,这是我的配置:

    buildscript {
    repositories {
    jcenter()
    }
    dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
    }
    }

    allprojects {
    repositories {
    jcenter()
    }
    }

    task clean(type: Delete) {
    delete rootProject.buildDir
    }
  • 在模块的build.gradle 中 使用如下配置,打开DataBinding支持:

    dataBinding {
    enabled true
    }

    下面是我的模块build.gradle

    apply plugin: 'com.android.application'

    android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    dataBinding {
    enabled true
    }

    defaultConfig {
    applicationId "com.idealist.databindingdemo"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }
    }

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    }

    到此为止已经完成了环境的配置。

  • 修改布局文件:用一个layout节点将原先的布局给包裹住,layout中分成两类,一类是data,一类是布局:
    重点是data的配置:
    在data节点中variable是必备的属性,name是这个变量的名字,type一般是包含Bean所处包名的全路径。当然也包含import属性。
    定义好data节点后就可以使用${} 对 bean进行访问了,比如这里的@{user.lastName},这时候会调用UserBean的getlastName()方法,所以一般Bean都需要有get/set方法

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
    <import type="com.idealist.databindingdemo.bean.UserBean"/>
    <variable
    name="user"
    type="UserBean"/>
    </data>
    <LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.idealist.databindingdemo.MainActivity">

    <TextView
    android:gravity="center"
    android:text="@{user.firstName}"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

    <TextView
    android:gravity="center"
    android:text="@{user.lastName}"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
    </LinearLayout>
    </layout>
  • 下面是Userbean的源码

    public class UserBean {
    public String getFirstName() {
    return firstName;
    }

    public void setFirstName(String firstName) {
    this.firstName = firstName;
    }

    public String getLastName() {
    return lastName;
    }

    public void setLastName(String lastName) {
    this.lastName = lastName;
    }

    private String firstName;
    private String lastName;

    public UserBean(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
    }
    }
  • 点击运行,这时候会产生一个ActivityMainBinding类位于/DataBindingDemo/app/build/intermediates/classes/debug/com/idealist/databindingdemo/databinding/ActivityMainBinding.java
    这个名字是根据布局生成的,这个类名可以指定的,后面会介绍这点。
    接下来就可以使用这个Binding将数据绑定到布局上了,修改MainActivity如下所示:

    public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    UserBean userBean = new UserBean("Android", "OS");
    binding.setUser(userBean);
    }
    }

    点击运行,会看到如下的结果:

Contents