默认状况下,普通函数和字符串是不可观察的,这就意味着,当您在数据绑定布局中须要使用它们时,只能在新建的时候获取它们的值,但在后续的操做中,却不能获得相应的数据。html
为了使对象可观察,数据绑定库中包含了一系列可观察的类,如: ObservableBoolean、ObservableInt、ObservableDouble… 和一些通用类、ObservableField。这里咱们将其统称为 “Observable Fields”。android
再后来,在咱们发布 Android 架构组件时首批就包含了 LiveData,这是另外一个 “可观察” 类,而且与数据绑定库兼容。bash
LiveData 能够感知生命周期,这一点与 Observable Fields 相比并无多大优点,由于 Data Binding 本来就能够检查视图活跃状况。所以对于 LiveData 来讲,它的优点在于不只支持 Transformations,并且能够与许多架构组件 (如 Room、 WorkManager) 相互配合使用。架构
综上,咱们推荐您使用 LiveData。方法也很是简单,只须要两个步骤。app
若是您是直接在数据绑定中使用 Observable Fields,只需将 Live ObservableSomething (或ObservableField < Something >) 替换为 LiveData < Something > 便可。ide
替换前:函数
<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"/>
复制代码
注意: /</ 不是错误,而是您必须对此处的 “<” 符号进行转义。布局
替换后:ui
<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 或 Controller 暴露可观察对象的话,则无需更改布局,只要用 ViewModel 中的 LiveData 替换这些 ObservableFields 便可。this
替换前:
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
}
复制代码
视图的绑定类中包含一个 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 的生命周期) 来处理潜在的分离 fragment。
如今,LiveData 对象能够与 Transformations 或 MediatorLiveData 配合使用,完成数据转换。
咱们也在 2019 年的 Android Dev Summit 上发布了一个与 LiveData 相关的视频,以下:
腾讯视频连接:
Bilibili 视频连接:
点击这里了解更多 LiveData 使用指南