DataBinding 引入
- Gradle引入
apply plugin: 'kotlin-kapt'//需要使用kapt作為注解 處理器
kapt {
generateStubs = true
}
android{
....
dataBinding {
enabled = true
}
}
dependencies{
///...
kapt "com.android.databinding:compiler:3.0.1"http://dataBinding需要的編譯處理工具
}
使用
- 使用普通的xml定義,以
layout
標(biāo)簽作為頂層標(biāo)簽,次級(jí)定義import
/variable
等
<?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>
-
簡(jiǎn)單的綁定(單向綁定)
- 1.先編寫一個(gè)kotlin的bean類(可以直接用data class)
data class MyBean( var name:String )
- 2.在xml中使用
@{bean.field}
- 3.在Activity/Fragment中設(shè)置:
val applicantInfoBinding = DataBindingUtil.setContentView<ActivityMyBeanBinding>(this, R.layout.activity_my_bean)
其中ActivityMyBeanBinding是Databinding生成的類,繼承自
android.databinding.ViewDataBinding
返回值就是一個(gè)ActivityMyBeanBinding對(duì)象,會(huì)在之后用到,這個(gè)類中我們會(huì)用到它保存的View的引用,以及我們引入的Bean對(duì)象,也就是
variable
定義的Bean,當(dāng)然還有他的父類的方法-
public abstract boolean setVariable(int variableId, Object value);
//設(shè)置field值 -
public void executePendingBindings()
//立即把bindings刷新 - 還有一些其他方法
- 1.先編寫一個(gè)kotlin的bean類(可以直接用data class)
-
雙向綁定
- 1.改造下kotlin類
- 首先,需要雙向綁定的類需要繼承
BaseObservable
- 雙向綁定屬性的get方法需要添加@Bindable注解,這樣在set方法調(diào)用
notifyPropertyChanged
方法時(shí)UI會(huì)重新獲取值 - 屬性的set方法最后調(diào)用
notifyPropertyChanged
方法 - 如果一個(gè)屬性需要邏輯處理為其他類型比如Int->String,可以寫setXXX/getXXX方法,XXX可以自己定義但是get/set方法要對(duì)應(yīng),然后我們?cè)趚ml中可以以
@={bean.XXX}
的形式雙向綁定該XXX
- 首先,需要雙向綁定的類需要繼承
- 2.普通的屬性
@Bindable//這個(gè)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.自定的屬性
var repayment_type: Int = 0//back field @Bindable fun getRepaymentTypeString(): String { return "XXXXXXXXXXX" } fun setRepaymentTypeString(str: String) { //設(shè)置backfield的值 if(str=="XXXXXXXXXXX") repayment_type = 0 else { repayment_type = 10 } notifyPropertyChanged(BR.repaymentTypeString)//通知更新 }
- 1.改造下kotlin類