Android Data Binding数据绑定详解(基础篇)

文章导航

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文件

1.Data Binding表达式

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是实体类的实例。在布局中可以直接通过 @{} 绑定属性值。

2.Data对象

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,如果数据出现空时,则默认显示当前类型的默认值。

3.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);

4.事件处理

4.1 在Activity中定义事件类以及进行初始化:

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());

4.2 布局文件引入命名空间,进行相关调用:


<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name

你可能感兴趣的:(Android)