//在module的build.gradle中
apply plugin: 'kotlin-kapt'//必须
android{
//AS 4.0 以下,
dataBinding{
enabled true
}
//AS 4.1之后
bindingFeature{
dataBinding = true
// for view binding :
// viewBinding = true
}
}
二、UI改造为使用DataBinding
非常简单,即将原有的XML布局外面添加 标签即可,在原有layout布局内部就可以是用dataBinding的相关语法
下面我们来一一演示dataBinding的使用细节,第一块为示例一、第二块为示例二
1、在data标签中声明variable属性,本例中name属性有name和address两个
2、针对这两个属性标签我们在布局文件中就可以访问到,并利用data的语法规则赋值、判空等操作即可:
参考语法:
variable
声明变量;import
导入类型;对于xml
的特殊符号需要转义类似&
- 绑定
xml
与data
格式:@{}
、@={}
(双向绑定) -
可用表达式、函数调用、属性参数
-
??
判空 -
?:
三目运算符 -
@string/str_name
资源引用,可用占位符format
-
+
拼接字符,使用``反引号 -
default
设置默认值 -
include
绑定 -
点击事件
示例二:ObservableField类型使用
1、data标签中的variable属性如下:
其中有ObservableField属性,以及引入进来了几个自定义的实体类对象:
其中ObUser为继承BaseObservable的binding数据,FoUser为个别属性的binding,User为普通数据类;
那么ObUser中的name、desc、str属性都可以是可以观察到数据变化的数据类型格式,而age则没有属性变化的能力;
FoUser中的age、name、desc属性全部为ObservableField,则都可以检测到数据变化的响应;
User则为普通类对象,没有改变数据的能力。
//1、继承BaseObservable的binding数据
class ObUser : BaseObservable() {
var age = 30
var name = ""
set(value) {
notifyPropertyChanged(BR.name)
field = "设置新值:" + value
}
@Bindable
get() {
return "$field 原始Name"
}
var desc = "这是field的User,菲尔"
set(value) {
field = value + ""
notifyPropertyChanged(BR.desc)
}
@Bindable
get() {
return "$field 菲尔Desc"
}
var str = ""
set(value) {
field = value
notifyPropertyChanged(BR.str)
}
@Bindable
get() = "age=${age},name=${name},desc=${field}"
}
//个别属性的binding
class FoUser {
var age = ObservableInt(20)
var name = ObservableField("欧泊Name")
var desc = ObservableField("这是BaseOb的User,欧泊")
var str = "age=${age.get()},name=${name.get()},desc=${desc.get()}"
}
class User {
var age = 70
var name = "普通user不会改name"
var desc = "哈哈哈哈,七十的老牛"
}
在我们点击按钮之后,可以看下界面的变化,
XML布局文件:
布局文件中可以看到使用了XML中访问java对象的语法:
android:text="@{`非Observable不改变name:` + user.name}"
android:text="@{`Observable类型改变name:` + oUser.name+oUser.age}"
android:onClick="@{click}"
kotlin代码:
user = User()//普通user
fUser = FoUser()//个别属性binding
oUser = ObUser()
click = View.OnClickListener {
address = "菜鸟窝!!"
user?.name = "普通user改name?"
fUser?.name?.set("属性变化fUser")//Smart cast to 'FoUser' is impossible 因为对象可null
oUser?.age = 22
oUser?.name = "改名啦"
}
完整项目代码