您当前的位置: 首页 > 
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Jetpack dataBinding(二)快速上手

沙漠一只雕得儿得儿 发布时间:2021-01-02 12:02:08 ,浏览量:0

一、添加依赖,启用dataBinding库
//在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的使用细节,第一块为示例一、第二块为示例二

三、dataBinding使用 示例一:data属性基础使用

1、在data标签中声明variable属性,本例中name属性有name和address两个



        

        

        

    

2、针对这两个属性标签我们在布局文件中就可以访问到,并利用data的语法规则赋值、判空等操作即可:

        

        

        

        

        

参考语法:

  • variable声明变量;import导入类型;对于xml的特殊符号需要转义类似&
  • 绑定xmldata格式:@{}@={}(双向绑定)
  • 可用表达式、函数调用、属性参数

  • ??判空

  • ?:三目运算符

  • @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 = "改名啦"
            }

完整项目代码

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.3632s