- 原文地址: Data Binding — Lessons Learnt
- 原文作者: Chris Banes
- 译文出自: 掘金翻译计划
- 本文永久链接: github.com/xitu/gold-m…
- 译者: Mirosalva
- 校对者: DevMcryYu
Data Binding 库 (下文中以『DB 库』词语来指代)提供了一个灵活强大的方式来绑定数据到 UI 界面。但是要用一句陈词滥调:『能力越大,责任越大』,仅仅是使用数据绑定,并不意味着你可以避免成为一个优秀 UI 开发者。
过去的几年我一直在 Android 开发中使用 data binding 库,本文会写出我这一路上了解到的与它有关的一些内容细节。
尽可能使用 bindings
自定义 binding adapter 是一种给 View 控件轻松提供自定义功能的好方法。和许多开发者一样,我对 binding adapter 研究得稍微深入,最终总结出一套包含 15 种不同用途的适配器 的类集。
最糟糕的实践是这类适配器,它们生成格式化的字符串并设置到
TextViews
控件,这些适配器通常仅在同一个布局文件中使用:
虽然这可能看起来很聪明,但是有三大缺点:
-
优化它们的过程太痛苦 。除非你把代码组织得非常好,否则你可能会有一个包含所有适配器方法的大文件,这与代码内聚和解耦原则相违背。
-
你需要使用 instrumentation 工具来做测试 。根据定义,你的 binding adapter 不会有返回值,它们接收一个输入参数后设置 view 的属性。这就意味着你必须使用 instrumentation 来测试你的自定义逻辑,这样会使得测试变得既缓慢又难以维护。
-
自定义 binding adapter 代码(通常)不是最佳选项 。如果你查看内建文本绑定[ 参考这里 ],你将会看到已经做了许多检查来避免调用
TextView.setText()
,这样就节省了被浪费的布局检测。我觉得自己陷入了这样的思维困境:DB 库将会自动优化我的 view 更新。它确实可以做到,但 仅限于 你使用被谨慎优化的内建 binding adapter的情况。
相反的,把你的方法的逻辑抽象为内聚类(我称之为文本创建者类),然后将它们传递给 binding。这样你就可以调用你的文本创建者类并使用内建 view binding:
这样我们可以从内建的绑定操作过程中提高效率,并且我们可以非常轻松地对创建格式化字符串的代码进行单元测试。
让你的自定义 binding 适配器变得高效
如果你确实需要使用自定义适配器,因为你所需的功能不存在,请尽量使其变得高效。我的意思是使用所有标准的 Android UI 优化:尽可能避免触发测量/布局操作。
这可以像检查当前使用的视图以及你设置的内容一样简单。这里有一个我们为
android:drawable
重新实现了标准 ImageView adapter 的样例:
遗憾的是,视图并不总是能够显示我们需要检查的状态。这里有一个在 TextView 上设置切换最大行的示例。它通过改变 TextView 的
maxLines
属性以及一个
延时布局转换
(android.view.ViewGroup)来实现切换。
之前 binding adapter 比较简单并且总是设置了
maxLines
属性和一个点击监听对象。TextView 在
setMaxLines()
被调用后总会触发一次布局,这就意味着每次 binding adapter 启动,一次布局就会被触发。