1.为什么要使用Data Binding?

当我们没使用Data Binding时候布局是这样的

<LinearLayout …><TextView android:id="@+id/name"/><TextView android:id="@+id/lastName"/>
</LinearLayout>

这是一个你经常会看到的 Android UI。 假设你有一堆带 ID 的视频内容。你的设计师来了,说:“好吧,让我们尝试添加新的信

息到这个布局,”这样,当你添加任何布局,你需要跟随另外一个 ID。你需要回到你的 Java 代码,修改 UI。

private TextView mName
protected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_main);mName = (TextView) findViewById(R.id.name);
}public void updateUI(User user) {if (user == null) {mName.setText(null);} else {mName.setText(user.getName());}
}

当有了一个新的 TextView,我们通过 findViewById 在代码中找到它,同时把它赋值给了变量,需要更新用户信息的时候,再通过它去给这个 TextView 设置上用户信息。

private TextView mName
protected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_main);mName = (TextView) findViewById(R.id.name);mLastName = (TextView) findViewById(R.id.lastName);
}
public void updateUI(User user) {if (user == null) {mName.setText(null);mLastName.setText(null);} else {mName.setText(user.getName());mLastName.setText(user.getLastName());}
}

总的来说,仅仅为了增加一个 View 到你的 UI 当中,而我们做了好几个步骤的事情。虽然有时它不需要任何脑力,但是这似乎是比较愚蠢的样板代码,。
比较好的是,已经有一些漂亮的库可以简化我们的这些操作。比如你使用 ButterKnife 这个库,能够摆脱讨厌的 findViewById 而获得组件,它让代码更加简洁易读。通过它可以节省很多额外的代码。

private TextView mName
protected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_main);ButterKnife.bind(this);
}
public void updateUI(User user) {if (user == null) {mName.setText(null);mLastName.setText(null);} else {mName.setText(user.getName());mLastName.setText(user.getLastName());}
}

这样做确实也是不错的,但是我们想做的更好呢?有什么可以直接生成它。我有一个布局文件,我有它们的 IDs.” 所以,可以使用 Holdr,它可以替你可以处理布局文件,然后为他们创建 View 组件。通过 Holder,转换 View 的 ID 到组件变量。

private Holdr_ActivityMain holder;
protected void onCreate(Bundle savedInstanceState) {setContentView(R.layout.activity_main);holder = new Holdr_ActivityMain(findViewById(content));
}
public void updateUI(User user) {if (user == null) {holder.name.setText(null);holder.lastName.setText(null);} else {holder.name.setText(user.getName());holder.lastName.setText(user.getLastName());}
} 

这种方式也不错,但其中仍然有很多是不必要的代码。而且这里还有一个可能我们没有想到的坑、我们无论如何无法减少代码量,它也是很简单的代码:我有一个 User 对象,我只是想把数据内容从这个 User 对象转移到 View 当中,但我们往往改了一个地方,忘了另一个地方,最终导致了产品运行崩溃。这也是我们关注的一部分,我们想摆脱所有这些比较蠢的代码。

当我们使用 Data Binding,它很像 Holder 模式,而且我们只要做一点点事情,其余的内容 Data Binding 会帮我们完成。

Data Binding引入---在我们app-->build.gradle加入

 // dataBinding 加入dataBinding {enabled = true}

简单绑定

private ActivityMainBinding mBinding;
protected void onCreate(Bundle savedInstanceState) {mBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
}public void updateUI(User user) {mBinding.setUser(user);}
<LinearLayout …><TextView android:text="@{user.name}"/><TextView android:text="@{user.lastName}"/>
</LinearLayout>

现在,当我看这些布局文件,我可以知道这些 TextView 要显示什么,它变得非常明显,所以我没必要再回到我当 Java 代码去阅读它们到底是干什么的。设计 Data Binding 库其中一个原因就是不想去用一些看起来不明显不直接的表达方式。使用 Data Binding,你只要简单地告诉它:“我们用这种类型的用户标记这个布局文件,现在我们将要找到它。”而如果你的产品设计经理要求你添加另一个新的 View 进去这个布局,你只要在这个布局文件中加上它无需改变其他 Java 代码:

<layout><data><variable name="user"type="com.android.example.User"/></data><LinearLayout …><TextView android:text="@{user.name}"/><TextView android:text="@{user.lastName}"/><TextView android:text='@{"" + user.age}'/></LinearLayout>
</layout>

同时,也非常容易寻找 bug. 你可以看着类似上面的代码,这是空的字符串加上 user.age 这样写是安全正确的,而如果你只是把int设置给 text 了,它会误以为这是资源索引 resId,找不到对应的资源从而导致崩溃。

那么Data Binding是怎么工作的呢?

Data Binding 做的第一件事就是进入并处理布局文件,其中的“进入”指的是,在你的程序代码正在被编译的过程中,它会找出布局文件中所有关于它的内容,获取到它所需要的信息,然后删掉它们,删掉它们的原因是如果继续存着视图系统并不认得它们。

<TextView android:visibility="@user.isAdmin ? View.VISIBLE : View.GONE}"/>

这个 user 是一个索引,之后的 View 也是个索引,另一个 View 也是个索引。它们都是索引或称标识.同样的对于 VISIBLE 和 GONE 也是如此。这里面有对象数据访问,是一个三目运算表达式,而对于Data Binding的库来说,它的工作就是从这些文件中把东西解析出来,了解里面有什么。
第三步就是在你代码编译过程中解决相关依赖问题。在这一步中,例如,我们看一下 user.isAdmin,想:“这是在运行时获取到 User 类对象中的一个布尔值。”
最后一步就是 Data Binding 会自动生成一些你不需要再写的类文件,总之到这里你只要享受它带来的好处就可以了。

forexample:

<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable name="user" type="com.android.example.User"/></data><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><TextView android:text="@{user.name}"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextView android:text="@{user.lastname}"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout>
</layout>

当编译时 Data Binding 进入,它会读懂并丢掉所有视图系统不认识的内容,同时放上我们的绑定 tags(标志),变成这样:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android:layout_width="match_parent"android:layout_height="match_parent"><TextView android:tag="binding_1"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextView android:tag="binding_2"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout>

这实际上就是如何做到数据绑定向后兼容

Data Binding学习(一)相关推荐

  1. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)

    接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...

  2. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

    本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...

  3. android 高级项目,从零开始的Android新项目8 - Data Binding高级篇

    承接上篇,本篇继续讲解一些Data Binding更加进阶的内容,包括:列表绑定.自定义属性.双向绑定.表达式链.Lambda表达式.动画.Component注入(测试)等. 列表绑定 App中经常用 ...

  4. WPF中的Data Binding调试指南

    点击蓝字"大白技术控"关注我哟 加个"星标★",每日良时,好文必达! WPF中的Data Binding如何Debug? 大家平时做WPF开发,相信用Visua ...

  5. Android Study 之 如何通过Data Binding提升撸码逼格(进阶篇)

    LZ-Says:每一次的选择,都将面临更多的希望,加油,而今迈步重头跃... 前言 前段时间,完结了一篇Data Binding前篇,地址如下: Android Study 之 如何通过Data Bi ...

  6. Android开发教程 - 使用Data Binding(二)集成与配置

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  7. XAML数据绑定(Data Binding)

    XAML数据绑定(Data Binding) Data Binding可以使得XAML标签属性的赋值更为灵活和方便.在绑定过程中,获取数据的标签成为目标标签:提供数据的标签成为源标签.在XAML中,一 ...

  8. Data Binding Library数据绑定框架

    Data Binding Library是Google在2015年IO大会上发布的一个用于实现MVVM设计模式的支持库 环境配置 在Android Studio 2.0 原生支持Data Bindin ...

  9. 谷歌推荐Data Binding实现MVVM模式(完整文档)

    Data Binding 类库 这篇文档将教你如何运用 Data Binding 类库来编写声明试布局,并且尽量减少粘合代码对你的应用逻辑和布局上的绑定. Data Binding 是一种灵活和广泛兼 ...

最新文章

  1. catia今天突然打不开了_苹果手机锁屏密码突然不正确了?不要慌!也先不要着急刷机!!!尝试一下以下方式!...
  2. ImportError: cannot import name ‘secure_filename‘的解决办法
  3. 解决placeholder兼容性问题
  4. 利用dos管道命令获取屏幕内容_汇编语言--常用DOS功能
  5. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)
  6. xpath以某个字符开始_XPATH技术补充-实例
  7. 串行线路上传输数据报的非标准协议:SLIP
  8. wdcp支持两种安装方式
  9. 互联网日报 | 6月30日 星期三 | 叮咚买菜正式登陆纽交所;微软发布Win 11首个预览版;三星宣布3nm芯片成功流片...
  10. 交通安全与智能控制专业学计算机吗,交通安全与智能控制专业主要做什么
  11. 每天CookBook之Python-037
  12. MYSQL索引失效的各种情形总结
  13. 05-文件与流-课堂测试(四则运算)
  14. win10如何解决非系统盘中出现的msdia80.dll文件
  15. 视频必备资源:免费音效素材下载
  16. 什么是短信接口API
  17. 什么是bcd码数据传输通讯_数据传输 数据通讯
  18. 基于STM32F103ZET6的多路复用模拟开关设计
  19. 微信中的个性化广告怎么关闭的
  20. c语言中front是什么,front用法,关于front的用法

热门文章

  1. [置顶]使用scrapy_redis,自动实时增量更新东方头条网全站新闻
  2. 全面替代Microsoft Office、Microsoft visio和WPS的优秀开源文档编辑器LibreOffice
  3. Oracle 10.2.0.5 + OFS 3.4.2 双节点集群
  4. 袋鼠云走进四川,共话企业数字经济发展新思路
  5. 基于SpringBoot、Vue的开源情侣空间
  6. 华为p4支持鸿蒙功能吗_华为鸿蒙系统支持哪些手机 鸿蒙系统支持以前的华为手机吗...
  7. 实时数据库简介和比较
  8. 七年级计算机学期教学要求,七年级信息技术教学工作总结
  9. 2020阿里巴巴社招面试题
  10. java 高效列转行,java 列转行