DataBinding in kotlin
DataBinding 引入
- Gradle引入
1
2
3
4
5
6
7
8
9
10
11
12
13
14apply 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
<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
3data class MyBean(
var name:String
) - 2.在xml中使用
@{bean.field}
- 3.在Activity/Fragment中设置:其中ActivityMyBeanBinding是Databinding生成的类,继承自
1
val applicantInfoBinding = DataBindingUtil.setContentView<ActivityMyBeanBinding>(this, R.layout.activity_my_bean)
android.databinding.ViewDataBinding
返回值就是一个ActivityMyBeanBinding对象,会在之后用到,这个类中我们会用到它保存的View的引用,以及我们引入的Bean对象,也就是variable
定义的Bean,当然还有他的父类的方法public abstract boolean setVariable(int variableId, Object value);
//设置field值public void executePendingBindings()
//立即把bindings刷新- 还有一些其他方法
- 1.先编写一个kotlin的bean类(可以直接用data class)
双向绑定
- 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可以只放在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
16var repayment_type: Int = 0//back field
fun getRepaymentTypeString(): String {
return "XXXXXXXXXXX"
}
fun setRepaymentTypeString(str: String) {
//设置backfield的值
if(str=="XXXXXXXXXXX")
repayment_type = 0
else {
repayment_type = 10
}
notifyPropertyChanged(BR.repaymentTypeString)//通知更新
}
- 1.改造下kotlin类