启用 Data Binding
Data Binding 库与 Android Gradle 插件捆绑在一起,所以不需要声明依赖,但需要启用。
在module
的build.gradle
:
android {
...
dataBinding {
enabled = true
}
}
转换 layout
<data>
标签将包含布局变量。
<data>
<variable name="name" type="String"/>
<variable name="lastName" type="String"/>
</data>
使用布局表达式:
<TextView
android:id="@+id/plain_name"
android:text="@{name}"
... />
改变布局加载方式
用了 Data Binding 后,就不用setContentView()
来进行布局加载了。
val binding : PlainActivityBinding =
DataBindingUtil.setContentView(this, R.layout.plain_activity)
现在就可以设置变量的值了
binding.name = "name"
binding.lastName = "last name"
配合 ViewModel
将变量集合在 ViewModel
中,可以更加方便管理。需要初始化:
binding.viewmodel = viewModel
处理事件
Data Binding 库还可以处理用户事件和在布局变量上执行动作。
android:onClick="@{() -> viewmodel.onLike()}"
配合 LiveData
Data Binding 配合 LiveData 可以使得数据在改变时自动使视图发生变化。
需要初始化lifecycleOwner
:
binding.lifecycleOwner = this
使用 Binding Adapter 创建自定义属性
@BindingAdapter("app:hideIfZero")
fun hideIfZero(view: View, number: Int) {
view.visibility = if (number == 0) View.GONE else View.VISIBLE
}
可以省略app:
。
使用:
<ProgressBar
android:id="@+id/progressBar"
app:hideIfZero="@{viewmodel.likes}"
多参数的 Binding Adapter
@BindingAdapter(value = ["app:progressScaled", "android:max"], requireAll = true)
fun setProgress(progressBar: ProgressBar, likes: Int, max: Int) {
progressBar.progress = (likes * max / 5).coerceAtMost(max)
}
requireAll
参数如果为true
,则前面定义的value
参数都要在xml
中定义;如果为false
,则缺少的属性为null
fasle
0
。
<ProgressBar
android:id="@+id/progressBar"
app:hideIfZero="@{viewmodel.likes}"
app:progressScaled="@{viewmodel.likes}"
android:max="@{100}"
...
注意
需要转换成 layout 才能使用自动生成的绑定类(转换后 build 一下)。
参考
布局和绑定表达式 | Android 开发者 | Android Developers
待
2020-3-11 22:22:18