数据绑定 - 想法
- 关于数据绑定的重要思想是创建一个对象,在编译时将两条遥远的信息连接/映射/绑定在一起,这样您就不必在运行时查找它。
- 向您展示这些绑定的对象称为 Binding 对象。它是由编译器创建的,虽然了解它在幕后的工作原理很有趣,但没有必要了解数据绑定的基本用法。
数据绑定和findViewById
- findViewById 是一个代价高昂的操作,因为它每次调用时都会遍历视图层次结构。
- 启用数据绑定后,编译器会创建对 a 中
<layout>
具有 id 的所有视图的引用,并将它们收集到 Binding 对象中。 - 在代码中,您创建绑定对象的实例,然后通过绑定对象引用视图,而无需额外的开销。
数据绑定视图和数据
- 更新数据然后更新视图中显示的数据非常麻烦并且是错误的来源。将数据保留在视图中也违反了数据和表示的分离。
- 数据绑定解决了这两个问题。您将数据保存在数据类中。您可以
<data>
向 中添加一个块,<layout>
以将数据标识为与视图一起使用的变量。视图引用变量。 - 编译器生成绑定视图和数据的绑定对象。
- 在代码中,您通过绑定对象引用和更新数据,这会更新数据,从而更新视图中显示的内容。
- 将视图绑定到数据集是使用数据绑定的更高级技术的基础。
在本练习中,您将通过使用数据绑定而不是 findViewById 来改进 AboutMe 应用程序,并使用绑定到 name_text 和nickname_text 视图的实际数据来显示信息。
请执行下列操作:
- 在 android 部分内的应用程序模块中的 build.gradle 文件中启用数据绑定:
dataBinding { enabled = true }
- 将activity_main.xml中的所有视图包装到一个
<layout>
标签中,并将命名空间声明移动到该<layout>
标签中。 - 在MainActivity中,创建一个绑定对象:
private lateinit var binding: ActivityMainBinding
- 在onCreate中,使用DataBindingUtil设置内容视图:
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
- 使用绑定对象替换所有对 findViewById 的调用,例如:
binding.doneButton.setOnClickListener….etc
提示:您可以在点击处理程序中使用 apply() 使您的代码更加简洁和可读。
- 为姓名和昵称创建数据类 MyName。
data class MyName(var name: String = "", var nickname: String = "")
- 添加一个
<data>
块到activity_main.xml。数据块位于布局标记内部,但位于视图标记之前。在数据块内,为 MyName 类添加一个变量。
<data>
<variable name="myName"
type="com.example.android.aboutme.MyName" />
</data>
- 在name_text、nickname_edit和nickname_text中,将对字符串文本资源的引用替换为对变量的引用,例如>
android:text="@={myName.name}"
- 在 MainActivity 中,创建 MyName 的实例。
// Instance of MyName data class. private val myName: MyName = MyName("Aleks Haecky")
- 并在 onCreate() 中,将 binding.myName 设置为它。
binding.myName = myName
- 在addNickname中,在myName中设置昵称的值,调用invalidateAll(),数据应该显示在您的视图中。
myName?.nickname = nicknameEdit.text.toString()
// Invalidate all binding expressions and request a new rebind to refresh UI invalidateAll()
- 当您运行代码时,它应该没有错误,并且外观和工作方式完全相同!