内容简介:数据绑定最重要的特性之一是默认情况下,普通基元和字符串是为了使对象可被观察,我们的数据绑定库中包含了一系列可被观察的类:
数据绑定最重要的特性之一是 可观察性 。你可以用它绑定数据和 UI 元素,以便在数据更改时,相关元素在屏幕上更新。
默认情况下,普通基元和字符串是 不 可被观察的,因此如果在数据绑定布局中使用它们,则在创建绑定时将使用它们的值,但对它们的后续更改会被忽略。
为了使对象可被观察,我们的数据绑定库中包含了一系列可被观察的类: ObservableBoolean
、 ObservableInt
、 ObservableDouble
和范型: ObservableField<T>
。从现在开始,我们称这些为 可观察域 。
几年后,作为第一波架构组件的一部分,我们发布了 LiveData ,这 又 是一个可被观察的。这是与数据绑定兼容的候选,因此我们添加了此功能。
LiveData 是可以感知生命周期的,对于可观察域而言,这并不是一个很大的优势,因为数据绑定库已经检查了视图何时处于活动状态。但是, LiveData 支持Transformations 和很多架构组件,比如Room 和WorkManager。
**出于这些原因,建议你迁移到 LiveData。**你只需要两步即可完成。
第一步:使用 LiveData 代替可观察域
如果你直接在数据绑定布局中使用可观察域,只需使用 LiveData<Something>
替换 ObservableSomething
(或 ObservableField<Something>
)。
修改前:
<data> <import type="android.databinding.ObservableField"/> <variable name="name" type="ObservableField<String>" /> </data> … <TextView android:text="@{name}" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 复制代码
Remember that %lt;
is not a typo. You have to escape the <
character inside XML layouts.
修改后:
<data> <import type="android.arch.lifecycle.LiveData" /> <variable name="name" type="LiveData<String>" /> </data> … <TextView android:text="@{name}" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 复制代码
或者,如果你从ViewModel(首选方法)或一个 presenter 层或控制器暴露可观察对象,则无需更改布局。只需在 ViewModel 中用 LiveData
替换那些 ObservableField
。
修改前:
class MyViewModel : ViewModel() { val name = ObservableField<String>("Ada") } 复制代码
修改后:
class MyViewModel : ViewModel() { private val _name = MutableLiveData<String>().apply { value = "Ada" } val name: LiveData<String> = _name // Expose the immutable version of the LiveData } 复制代码
第二步:设置 LiveData 的生命周期所有者
绑定类有一个名为 setLifecycleOwner
的方法,在从数据绑定布局中观察 LiveData 时必须调用该方法。
修改前:
val binding = DataBindingUtil.setContentView<TheGeneratedBinding>( this, R.layout.activity_data_binding ) binding.name = myLiveData // or myViewModel 复制代码
修改后:
val binding = DataBindingUtil.setContentView<TheGeneratedBinding>( this, R.layout.activity_data_binding ) binding.lifecycleOwner = this // Use viewLifecycleOwner for fragments binding.name = myLiveData // or myViewModel 复制代码
注意:如果要设置 fragment 的内容,建议使用 fragment.viewLifecycleOwner
(而不是 fragment 的生命周期)来处理潜在的分离的 fragments。
现在你可以使用你的带有Transformations 和MediatorLiveData 的LiveData 对象。如果你不熟悉这些功能,可以参阅 “Fun with LiveData” 录像,来自 2018 Android 开发者大会 。
如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为掘金 上的英文分享文章。内容覆盖 Android 、 iOS 、 前端 、 后端 、 区块链 、 产品 、 设计 、 人工智能 等领域,想要查看更多优质译文请持续关注 掘金翻译计划 、官方微博、 知乎专栏 。
以上所述就是小编给大家介绍的《[译] Android 数据绑定库 — 从可观察域到 LiveData 仅需两步》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 仅需这一篇,妥妥的吃透”负载均衡”
- 仅需六步,从零实现机器学习算法!
- 二阶优化!训练ImageNet仅需35个Epoch
- 仅需10分钟:开启你的机器学习之路
- 仅需两步实现内网端口映射
- 仅需4步,轻松升级K3s集群!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。