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