首页 > 代码库 > 告别findViewById(),ButterKnife,使用Google Data Binding Library(1)

告别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.android.com/studio/releases/gradle-plugin.html#updating-plugin

使用环境

在Android Studio 1.3或以上版本,提供Data Binding Library支持

app的build.gradle中,一行代码搞定.

android {
    ....
    dataBinding {
        enabled = true
    }
}

在布局文件中使用Data Binding Library

1.在原来布局文件中,加入<layout>根标签.

2.<layout>标签的第一个子标签是<data>标签.

就像下面这样:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

注意:

<data>标签下的变量(数据对象)user可以在布局中使用,这个user的类型是"com.example.User".

设置这个变量的方法是setUser();我们会在下面学到.

在布局文件中,使用"@{}"语法,

android:text="@{user.firstName}"

这便实现了数据和view的绑定.即:MVVM设计

数据类User

User类是POJO类型的情况:

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

User类是JavaBean类型的情况:

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

这两种情况,在使用TextView中使用@{user.firstName}表达式,上面的User类,会用firstName成员变量(filed)来设置text.下面的JavaBean会调用getFirstName()方法来设置text.

当然,如果firstName()方法存在的话,就会调用这个方法.

绑定数据

默认情况下,绑定的类会自动生成,名字是layout文件的名字(如main_activity.xml生成为MainActivityBinding.java),首字母和下划线后字母大写,增加Binding后缀.

提示:我们可以自定义生成绑定类的名字,只需要在<data>标签内增加class="CustomerClassName"

<data class=“CustomerClassName”>

</data>

这个生成的类保存所有布局属性(如上面的user)到布局视图的所有绑定,并且知道如何为绑定的表达式分配值.

最简单的绑定方法就是在布局界面填时设置绑定:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

好的.一个简单的例子就完成了.运行这个app,你会看到如你所想的这个界面:

 

 

当然上面的例子是使用:

MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity)

同样也可以使用:

MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());

ListView之类的绑定.

下篇再见

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