Skip to content

Data Binding 入门

Posted on:March 11, 2020 at 22:21:42 GMT+8

启用 Data Binding

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

modulebuild.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

Android Data Binding

2020-3-11 22:22:18