一、什么是DataBinding
DataBinding顾名思义数据绑定,就是一个数据绑定的库,
二、DataBinding所需的环境
Android Studio:1.3及以上 (更新Android Studio)
Gradle版本:1.5及以上
SDK版本:Android 2.1及以上
三、DataBinding的基本用法
(一)开启DataBinding
在Gradle配置一下
android {
....
dataBinding {
enabled = true
}
}
这里还有个细节,开启DataBinding之前运行一下程序可以看到classes文件夹是这样的,
开启DataBinding之后再运行一下程序,再来看classes文件夹是这样的,多了一些东西。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable
name="user"
type="com.ce.databindingtest.bean.User" />
</data>
<LinearLayout
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.ce.databindingtest.activity.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="User name"
android:text="@{user.userName}"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:text="@{user.password}"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Login"/>
</LinearLayout>
</layout>
以前我们要操作控件首先要对控件添加个id,然后在Activity中findViewById通过控件id找到它才能进行操作,后来有了ButterKnife这类通过注解来操作控件的库方便了很多,也使得代码更简洁,但也是要给控件添加个id,现在我们用DataBinding不需要添加id了。
从布局中可以看到根标签得是layout,里面第一个标签是data,从第二个标签起才是我们要显示的布局控件的开始,data标签就是数据相关的标签了,里面有个variable标签即变量嘛,既然是变量声明出来当然要有变量名name和类型type(哪个类的变量),在控件中使用的时候用"@{}"进行设置,像上面的布局EditText控件:
android:text="@{user.userName}"
(三)User类
package com.ce.databindingtest.bean;
public class User {
private String userName;
private String password;
public User() {
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
上面的布局中需要一个User类。
(四)中间类
此时先运行一下程序,再看下。
会发现还多了个ActivityMainBinding.class,这个类的名字是有规律的,前面的是布局的名称,后面再加个Binding,比如我现在的layout的名称是activity_main.xml,这个类的名字就是ActivityMainBinding,如果我把布局名称改为main_layout.xml再运行一下,
现在这个类的名称就是MainLayoutBinding了,点击进去看下,该类是继承自ViewDataBinding的,
public class MainLayoutBinding extends ViewDataBinding
还有个setUser方法和getUser方法。
public void setUser(User user) {
this.mUser = user;
synchronized(this) {
this.mDirtyFlags |= 1L;
}
this.notifyPropertyChanged(1);
super.requestRebind();
}
public User getUser() {
return this.mUser;
}
这不就是我们定义的User类么(就是)。
(五)Activity
这里不需要使用Activity的setContentView()方法加载布局,而是用DataBindingUtil类的setContentView()方法,其实里面也是用传入的Activity调用setContentView()方法,看下DataBindingUtil的setContentView()方法的源码。package com.ce.databindingtest.activity; import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.ce.databindingtest.R; import com.ce.databindingtest.bean.User; import com.ce.databindingtest.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); //使用DataBindingUtil的setContentView设置布局文件 ActivityMainBinding _ViewDataBinding = DataBindingUtil.setContentView(this, R.layout.main_layout); User _User = new User("CE", "123456"); // 绑定数据 _ViewDataBinding.setUser(_User); } }
返回的是<T extends ViewDataBinding>类型,我们刚才看的ActivityMainBinding类不就是继承ViewDataBinding的?所以用ActivityMainBinding类来接收,刚才我们也看到该类有个setUser()方法,所以new了个User()对象传进去,运行一下看看。public static <T extends ViewDataBinding> T setContentView(Activity activity, int layoutId) { return setContentView(activity, layoutId, sDefaultComponent); } public static <T extends ViewDataBinding> T setContentView(Activity activity, int layoutId, DataBindingComponent bindingComponent) { activity.setContentView(layoutId); View decorView = activity.getWindow().getDecorView(); ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content); return bindToAddedViews(bindingComponent, contentView, 0, layoutId); }
![]()
数据就这样被绑定了,是不是感觉很好用?好了,基本使用就这样。