数据绑定的作用
- 数据绑定消除低效率调用findViewById()。
- 数据绑定可以将视图XML绑定到数据类,修改数据类就可以驱动视图变化。
利用数据绑定,代替findViewById()
在
build.gradle
文件中添加数据绑定支持dataBinding { enabled = true }
将要绑定的布局XML文件的根视图标签改为
<layout> <LinearLayout> ...... </LinearLayout> </layout>
在主活动类
MainActivity
中,定义一个绑定变量,使用延迟初始化private lateinit var binding: ActivityMainBinding
初始化绑定变量,并给主活动添加布局
// 在onCreate()方法中添加以下语句 binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
此时原本需要调用
findViewById()
的语句都可以修改为引用绑定对象的视图(View)成员变量findViewById<Button>(R.id.done_button) // 替换为下面的写法 // 绑定对象的视图(View)成员变量的名字是布局文件XML中id的驼峰式写法 binding.doneButton
利用数据绑定,将视图绑定到数据
新建一个数据类。
data class MyData(var data1:String = "" , var data2: String = "" ){ }
- 在布局XML文件中的
标签下添加一个标签 在标签下添加一个
标签,并在 中添加两个属性 name
和type
<layout> <data> <variable name = "myData" // 此处为数据类在xml中的名字,自由定义 type = "此处为数据类的路径" /> </data> <LinearLayout> ...... </LinearLayout> </layout>
在主活动类中
MainActivity
定义并初始化一个数据类实例private val myData: MyData = MyData("some data")
将数据类实例的引用添加到绑定对象(数据绑定)
// 前者的myData是xml中的变量,后者的myData是数据类实例对象 binding.myData = myData
在布局XML中,将视图的内容设置为在标签中定义的变量。使用点符号访问变量内部的成员数据。格式如下。
android:text = "@={myData.data1}"
若数据类的信息发生更新,使用invalidateAll()来同步更新xml
// 主活动类中,此处的myData是数据类实例对象 myData.data1 = "some new data" invalidateAll()
如果传入的数据类本身的变化,而不是内部深层属性的变化,则可以不用invalidateAll()来同步。