数据绑定的作用

  1. 数据绑定消除低效率调用findViewById()。
  2. 数据绑定可以将视图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文件中的标签下添加一个标签
  • 标签下添加一个标签,并在中添加两个属性nametype

    <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()来同步。
最后修改:2020 年 06 月 03 日
如果觉得我的文章对你有用,请随意赞赏