0%

Data Binding入门

启用 Data Binding

Data Binding 库与 Android Gradle 插件捆绑在一起,所以不需要声明依赖,但需要启用。

modulebuild.gradle

1
2
3
4
5
6
android {
...
dataBinding {
enabled = true
}
}

转换 layout

<data>标签将包含布局变量。

1
2
3
4
<data>
<variable name="name" type="String"/>
<variable name="lastName" type="String"/>
</data>

使用布局表达式:

1
2
3
4
<TextView
android:id="@+id/plain_name"
android:text="@{name}"
... />

改变布局加载方式

用了 Data Binding 后,就不用setContentView()来进行布局加载了。

1
2
val binding : PlainActivityBinding =
DataBindingUtil.setContentView(this, R.layout.plain_activity)

现在就可以设置变量的值了

1
2
binding.name = "name"
binding.lastName = "last name"

配合 ViewModel

将变量集合在 ViewModel中,可以更加方便管理。需要初始化:

1
binding.viewmodel = viewModel

处理事件

Data Binding 库还可以处理用户事件和在布局变量上执行动作。

1
android:onClick="@{() -> viewmodel.onLike()}"

配合 LiveData

Data Binding 配合 LiveData 可以使得数据在改变时自动使视图发生变化。

需要初始化lifecycleOwner

1
binding.lifecycleOwner = this

使用 Binding Adapter 创建自定义属性

1
2
3
4
@BindingAdapter("app:hideIfZero")
fun hideIfZero(view: View, number: Int) {
view.visibility = if (number == 0) View.GONE else View.VISIBLE
}

使用:

1
2
3
<ProgressBar
android:id="@+id/progressBar"
app:hideIfZero="@{viewmodel.likes}"

多参数的 Binding Adapter

1
2
3
4
@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

1
2
3
4
5
6
        <ProgressBar
android:id="@+id/progressBar"
app:hideIfZero="@{viewmodel.likes}"
app:progressScaled="@{viewmodel.likes}"
android:max="@{100}"
...

参考

Android Data Binding

2020-3-11 22:22:18