android DataBinding

136 阅读1分钟

参考官方教程 developer.android.google.cn/topic/libra…

数据绑定库 是 Android Jetpack的一部分

借助这个库,可以声明性将布局UI绑定代码中的数据

在使用这个库之前,通常是这样实现的:

代码中

   findViewById<TextView>(R.id.sample_text).apply {
        text = viewModel.userName
    }

xml资源

<TextView
        android:text="@{viewmodel.userName}" />

现在想要实现取代 findViewById() 的调用

使用入门

在app build.gradle 文件添加dataBinding元素

android {
    ...
    dataBinding {
        enabled = true
    }
}

布局和绑定表达式

数据绑定布局文件: 以根标记 layout 开头, 后跟 dataview 元素, 如 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="user" type="com.king.jetpacktest.User"/>
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="270dp"
            android:layout_height="70dp"
            android:text="@{user.firstName}"
            android:textColor="#F30808" />

        <TextView
            android:layout_width="270dp"
            android:layout_height="70dp"
            android:text="@{user.lastName}"
            android:textColor="#6310F6" />
    </LinearLayout>
</layout>

此时UI预览界面没有显示字符串

注意: 布局表达式应保持精简,因为它们无法进行单元测试

新建一个 数据类: User.kt

data class User(val firstName: String, val lastName: String)

绑定数据

系统会为每个布局文件生成一个绑定类,默认是xml名字大驼峰写法 + Binding 后缀 (activity_main.xml ==> ActivityMainBinding)

MainActivity.kt 中:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding: ActivityMainBinding = DataBindingUtil.setContentView(
            this, R.layout.activity_main)

        binding.user = User("Test", "User")

    }
}

此时运行显示:

databinding.png

事件处理 / 方法引用