Android Data Binding数据绑定详解(基础篇)
Android Data Binding数据绑定详解(进阶篇)
在2015年的谷歌IO大会上,Android UI Toolkit团队发布了DataBinding 框架,将数据绑定引入了Android开发。以后可以直接在 layout 布局 xml 文件中绑定数据了,无需再 findViewById 然后手工设置数据了。官方文档说明
使用之前,需要在Android Studio中build.gradle配置开启Data Binding,具体如下:
android {
....
dataBinding {
enabled = true
}
}
Data Binding layout文件有点不同的是:起始根标签是layout,接下来一个data元素以及一个view的根元素。这个view元素就是你没有使用Data Binding的layout文件的根元素。举例说明如下:
<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内type对应的是实体类User,name是实体类的实例。在布局中可以直接通过 @{} 绑定属性值。
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;
}
}
在Android中接收后台返回实体类,多少难免会有一些空值,而我们在不注意的时候直接使用则会引发空指针这个异常,那么使用Data Binding后,我们则无需关注这块内容。如果使用Data Binding,如果数据出现空时,则默认显示当前类型的默认值。
默认情况下,一个Binding类会基于layout文件的名称而产生,将其转换为Pascal case(译注:首字母大写的命名规范)并且添加“Binding”后缀。上述的layout文件是main_activity.xml
,因此生成的类名是MainActivityBinding
。此类包含从layout属性到layout的Views中所有的bindings(例如user变量),并且它还知道如何给Binding表达式分配数值。
创建bindings的最简单的方式是在inflating(译注:layout文件与Activity/Fragment的“链接”)期间如下:
@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);
}
或者你可以通过如下获取View:
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());
在Fragment 或者RecyclerView adapter 使用Data Binding时,
MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);
//or
MyLayoutBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
如果布局是使用其他机制扩充的,可单独绑定,如下所示:
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityBindListenerBinding mBindListenerBinding = DataBindingUtil.setContentView(this, R.layout.activity_bind_listener);
mBindListenerBinding.setPersenter(new Presenter());
}
初始化这个事件内部类,方式同样有俩种,如下:
mBindListenerBinding.setPersenter(new Presenter());
mBindListenerBinding.setVariable(BR.persenter,new Persenter());
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name