DataBinding使用教程

MVVM 和 MVP MVC,我觉得仁者见仁,智者见智吧!

MVVM 一直都是未来的趋势

我比较赞成使用 :

  • ViewModel + DataBinding 的形式操作View 与数据的绑定。
  • LiveData + Retrofit,Room + Paging + LiveData 操作网络、数据库等数据。

DataBinding特点:

  • 大幅度精简了java代码量.
  • 并且代码可读性更高.
  • 对性能的影响基本为零.

今天学习下DataBinding 的用法吧!


Data Binding 简介

Data Binding 翻译为中文是 数据绑定库。

允许您使用声明性格式而不是以编程方式将布局中的UI组件绑定到应用程序中的数据源。

代码示例:

  • JAVA版
1
2
TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());
  • DataBinding版
1
2
<TextView
android:text="@{viewmodel.userName}" />

官方相关使用示例代码

官方相关术语及使用介绍

布局和绑定表达式

  • 表达式语言允许您编写将变量连接到布局中的视图的表达式。
  • 数据绑定库会自动生成将布局中的视图和数据对象用来绑定所需的类。
  • 该库提供在布局中,将数据对象直接赋值给xml布局的功能。

示列代码:

1
2
3
4
5
6
7
8
9
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<!-- 该类的一个对象,type的对应的包的类名-->
<variable
name="viewmodel" type="com.myapp.data.ViewModel" />
</data>
<ConstraintLayout... /> <!-- UI layout's root element -->
</layout>

使用可观察的数据对象

  • 数据绑定库提供了类和方法,可以轻松地观察数据以进行更改。
  • 您不必担心在基础数据源发生更改时刷新UI。
  • 您可以使您的变量或其属性可观察。该库允许您使对象,字段或集合可观察。

生成的绑定类

  • 数据绑定库生成用于访问布局的变量和视图的绑定类。
  • 此页面显示如何使用和自定义生成的绑定类。

绑定适配器

  • 对于每个布局表达式,都有一个绑定适配器。设置相应属性或侦听器所需的框架调用。
    示列代码:
    1
    2
    3
    4
    @BindingAdapter("app:goneUnless")
    public static void goneUnless(View view, Boolean visible) {
    view.visibility = visible ? View.VISIBLE : View.GONE;
    }

将布局视图绑定到体系结构组件

Android支持库包含架构组件[LiveData ViewModel Room],您可以使用它来设计健壮,可测试和可维护的应用程序。您可以将架构组件与数据绑定库一起使用,以进一步简化UI的开发。

双向数据绑定

数据绑定库支持双向数据绑定。用于此类绑定的表示法支持接收对属性的数据更改并同时侦听对该属性的用户更新的能力。

使用介绍

构建环境

  • 确保能使用Data Binding,需要下载最新的 Support repository
  • 在模块的build.gradle文件中添加dataBinding配置
    1
    2
    3
    4
    5
    6
    android {
    ....
    dataBinding {
    enabled = true
    }
    }
    注意:如果app依赖了一个使用 Data Binding 的库,那么app module 的 build.gradle 也必须配置 Data Binding。

布局文件中使用Data Binding布局

简单示例:

  • 第一步 xml中 使用语法

    • 对于 text 赋值 “@{对象.属性}”
    • 对于事件绑定 android:onClick=“@{对象::方法名}”
    • 加上传参 android:onClick=“@{() -> 对象.方法名(参数1,参数2,… )}”
    • 调用点传参 android:onClick=”@{(view) -> handler.onTaskClick(task)}”
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      <?xml version="1.0" encoding="utf-8"?>
      <layout xmlns:android="http://schemas.android.com/apk/res/android">
      <data>
      <!-- 变量user, 描述了一个布局中会用到的属性 -->
      <variable name="user" type="top.goluck.databinding.model.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>
  • 第二步 数据对象 - (Model)

1
2
3
4
5
6
7
8
9
10
11
12
package top.goluck.databinding.model.User;
public class User {
private final String mFirstName;
private final String mLastName;
private int mAge;

public User(String firstName, String lastName, int age) {
mFirstName = firstName;
mLastName = lastName;
mAge = age;
}
}
  • 第三步 绑定数据 - (ViewModel)
    • 默认情况下,会基于布局文件生成一个继承于ViewDataBinding 的 Binding 类
    • 命名规则:如布局文件叫:main_activity.xml,会生成MainActivityBinding类。这个类包含了布局文件中所有的绑定关系。会根据绑定表达式给布局文件赋值。
1
2
3
4
5
6
7
8
9
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ActivityBaseBinding 类是自动生成的
ActivityBaseBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_base);
User user = new User("Connor", "Lin");
// 所有的 set 方法也是根据布局中 variable 名称生成的
binding.setUser(user);
}

更多java与xml对应语法

网上已经有很多文章总结了用法,这里提供相关链接

源码分析

相关参考链接

其他推荐阅读

相关插件