生活中的Design.

DataBinding in kotlin

字数统计: 581阅读时长: 2 min
2019/12/11 Share

DataBinding in kotlin

DataBinding 引入

  • Gradle引入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    apply plugin: 'kotlin-kapt'//需要使用kapt作为注解 处理器
    kapt {
    generateStubs = true
    }
    android{
    ....
    dataBinding {
    enabled = true
    }
    }
    dependencies{
    ///...
    kapt "com.android.databinding:compiler:3.0.1"//dataBinding需要的编译处理工具
    }

使用

  • 使用普通的xml定义,以layout标签作为顶层标签,次级定义import/variable

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="utf-8"?>
    <layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <data>
    <variable
    name="bean"
    type="bean类的全路径,例如com.example.app.bean.MyBean"/>
    </data>
    <!-- 这里是原来的layout -->
    <TextView
    android:text="@{bean.name}"
    />
    </layout>
  • 简单的绑定(单向绑定)

    • 1.先编写一个kotlin的bean类(可以直接用data class)
      1
      2
      3
      data class MyBean(
      var name:String
      )
    • 2.在xml中使用@{bean.field}
    • 3.在Activity/Fragment中设置:
      1
      val applicantInfoBinding = DataBindingUtil.setContentView<ActivityMyBeanBinding>(this, R.layout.activity_my_bean)
      其中ActivityMyBeanBinding是Databinding生成的类,继承自android.databinding.ViewDataBinding
      返回值就是一个ActivityMyBeanBinding对象,会在之后用到,这个类中我们会用到它保存的View的引用,以及我们引入的Bean对象,也就是
      variable定义的Bean,当然还有他的父类的方法
      • public abstract boolean setVariable(int variableId, Object value);//设置field值
      • public void executePendingBindings()//立即把bindings刷新
      • 还有一些其他方法
  • 双向绑定

    • 1.改造下kotlin类
      • 首先,需要双向绑定的类需要继承BaseObservable
      • 双向绑定属性的get方法需要添加@Bindable注解,这样在set方法调用notifyPropertyChanged方法时UI会重新获取值
      • 属性的set方法最后调用notifyPropertyChanged方法
      • 如果一个属性需要逻辑处理为其他类型比如Int->String,可以写setXXX/getXXX方法,XXX可以自己定义但是get/set方法要对应,然后我们在xml中可以以@={bean.XXX}的形式双向绑定该XXX
    • 2.普通的属性
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      @Bindable//这个bindable可以只放在get方法
      var id: Int = 0
      set(value) {
      field = value
      println("profile id set $field")
      notifyPropertyChanged(BR.id)
      }
      get() {
      println("profile id get $field")
      return field
      }
    • 3.自定的属性
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
       var repayment_type: Int = 0//back field

      @Bindable
      fun getRepaymentTypeString(): String {
      return "XXXXXXXXXXX"
      }

      fun setRepaymentTypeString(str: String) {
      //设置backfield的值
      if(str=="XXXXXXXXXXX")
      repayment_type = 0
      else {
      repayment_type = 10
      }
      notifyPropertyChanged(BR.repaymentTypeString)//通知更新
      }
CATALOG
  1. 1. DataBinding in kotlin
    1. 1.0.1. DataBinding 引入
    2. 1.0.2. 使用