# DataBindingDemo **Repository Path**: wangweijun123/DataBindingDemo ## Basic Information - **Project Name**: DataBindingDemo - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-14 - **Last Updated**: 2021-08-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 写在前面 要学习新东西,最好的办法是先学会如何使用。所以,本文仅作 Android Data Binding 的介绍并结合 [DataBindingDemo][DataBindingDemo] 来理解它的用法,后续再对其原理进行深入探讨。 ## 简介 Data binding 在2015年7月发布的Android Studio v1.3.0 版本上引入,在2016年4月Android Studio v2.0.0 上正式支持。目前为止,Data Binding 已经支持双向绑定了。 Databinding 是一个实现数据和UI绑定的框架,是一个实现 MVVM 模式的工具,有了 Data Binding,在Android中也可以很方便的实现MVVM开发模式。 Data Binding 是一个support库,最低支持到Android 2.1(API Level 7+)。 Data Binding 之前,我们不可避免地要编写大量的毫无营养的代码,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通过 Data Binding , 我们可以通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样就不用编写大量的毫无营养的代码了。 ## 构建环境 1. 首先,确保能使用Data Binding,需要下载最新的 Support repository。否则可能报错,如图: ![](https://raw.githubusercontent.com/ConnorLin/BlogImages/master/Android%20Data%20Binding/build_err.png) 2. 在模块的build.gradle文件中添加dataBinding配置 android { .... dataBinding { enabled = true } } > 注意:如果app依赖了一个使用 Data Binding 的库,那么app module 的 build.gradle 也必须配置 Data Binding。 ## Data Binding 布局文件 - (View) Data binding 的布局文件与传统布局文件有一点不同。它以一个 layout 标签作为根节点,里面是 data 标签与 view 标签。view 标签的内容就是不使用 Data Binding 时的普通布局文件内容。以下是一个例子: ```xml ``` ### 数据对象 - (Model) 假设你有一个 plain-old Java object(POJO) 的 User 对象。 ```java 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; } } ``` 或者是 JavaBean 对象: ```java 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; } public String getFirstName() { return mFirstName; } public String getLastName() { return mLastName; } public int getAge() { return mAge; } } ``` 从 Data Binding 的角度看,这两个类是一样的。用于 TextView 的 `android:text` 属性的表达式`@{user.firstName} `,会读取 POJO 对象的 `firstName` 字段以及 JavaBeans 对象的 `getFirstName() `方法。 ### 绑定数据 - (ViewModel) 在默认情况下,会基于布局文件生成一个继承于 `ViewDataBinding` 的 Binding 类,将它转换成帕斯卡命名并在名字后面接上`Binding`。例如,布局文件叫 `main_activity.xml `,所以会生成一个 `MainActivityBinding` 类。这个类包含了布局文件中所有的绑定关系,会根据绑定表达式给布局文件赋值。在 inflate 的时候创建 binding 的方法如下: ```java @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); } ``` *** ### 事件处理 本部分源码请参考 [DataBindingDemo][DataBindingDemo] -> `EventActivity` 部分。 类似于 android:onClick 可以指定 Activity 中的函数,Data Binding 也允许处理从视图中发送的事件。 有两种实现方式: + 方法调用 + 监听绑定 > 二者主要区别在于方法调用在编译时处理,而监听绑定于事件发生时处理。 #### 方法调用 相较于 android:onClick ,它的优势在于表达式会在编译时处理,如果函数不存在或者函数签名不对,编译将会报错。 以下是个例子: ```java public class EventHandler { private Context mContext; public EventHandler(Context context) { mContext = context; } public void onClickFriend(View view) { Toast.makeText(mContext, "onClickFriend", Toast.LENGTH_LONG).show(); } } ``` 表达式如下: ```xml