一.简介
DataBinding 是 Google 为 Android 开发者打造的一款数据绑定库,主要目的是让开发者用该库来编写声明式布局,并尽量减少绑定应用程序逻辑和布局所需的胶合代码。简单来说就是我们使用了 DataBinding 后就可以彻底摆脱 findViewById 了,也不用再在Activity里面写一堆控件的命名,所有的数据绑定,监听事件都放到了布局文件里面,Activity瞬间清爽了很多,提高了代码的可读性.
二.构建使用环境
适用环境 : Android 2.1(API level 7+) 及以后, Gradle 1.5.0-alpha1 及以后
集成方式 : 直接在 build.gradle 文件下加入以下代码即可,需要注意的是如果要在model里面使用的话,要在model里面的build.gradle也加上下面代码.
android {
....
dataBinding {
enabled = true
}
}
三.声明式布局的写法
在根布局的内部添加一个 <data></data> 标签,然后用 <variable /> 标签声明变量,
name 表示变量名, type 表示变量的类型,这里需要写上包名.下面这个例子就是将 User 对象声明在布局文件里面,布局文件里面的控件就可以用声明的变量名称直接引用User的属性.
<?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>
User 可以使用简单的java对象(POJO)
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;
}
}
也可以使用 JavaBeans 对象
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;
}
}
四.绑定数据
@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);
}
如果要在 ListView 或 RecyclerView adapter 里面使用的话可以用下面方法
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
五.绑定监听事件
控件绑定事件和以前在布局里面绑定事件类似,都是在控件的 android:onClick , android:onLongClick 等属性里面添加方法,只不过实现方式有所变化,具体来说有两种不同的实现方式.
方法引用 : 和以前的事件绑定 android:onClick = "onClick" 类似,以前是将方法写在Activity里面,现在可以单独写到一个类里面,然后作为变量导入布局文里,另外的一个区别是以前的写法编译器在编译的时候不会判断 onClick 方法是否存在,只有在运行的时候才会报错,现在的方法引用会在编译时期判断引用的方法是否存在,如不存在编译不通过.
public class MyHandlers {
public void onClickFriend(View view) { ... }
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.MyHandlers"/>
<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}"
android:onClick="@{handlers::onClickFriend}"/>
</LinearLayout>
</layout>
监听器绑定 : 直接在 android:onClick 属性里面传入一个监听器,这里用 lambda 表达式传入一个监听器,前提是要在绑定数据时设置 Presenter 监听器.
@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);
binding.setPresenter(new Persenter(){
@Override
public void onClick(User user) {
//处理事件
}
});
}
public interface Presenter {
void onSaveClick(User user);
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.android.example.User" />
<variable name="presenter" type="com.android.example.Presenter" />
</data>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:onClick="@{() -> presenter.onSaveClick(user)}" />
</LinearLayout>
</layout>
需要注意的是:
- 在使用方法引用时我们传入的方法返回值和参数要和控件属性所接收的方法保持一致,而监听器绑定只需要保持返回值一致即可.
- 监听器绑定 只能在 Android Gradle Plugin 2.0 及以上才能用.
- 方法引用和监听器绑定的主要区别在于方法引用的监听器实现是在绑定数据时创建的,而监听器绑定是在事件触发时创建的
//android:onClick 对应的是
public static interface OnClickListener {
void onClick(View v);
}
//android:onLongClick 对应的是
public static interface OnLongClickListener {
boolean onLongClick(View v);
}
简单入门就先到这里了,下一篇会详细说一下声明式布局的一些详细属性和写法
网友评论