数据绑定库 是 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 开头, 后跟 data 和 view 元素, 如
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")
}
}
此时运行显示: