码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JetPack组件Databinding



    Android JetPack组件Databinding

    • 简介
    • 启用databinding
    • 布局xml
      • variable (变量标签)
      • data (数据标签)
      • @{}表达式
    • 绑定普通数据
    • 绑定可观察数据
      • 对单个变量的绑定:fields
      • 对集合的绑定:collections
      • 绑定对象:objects
      • 绑定 LiveData
      • 双向绑定


    简介

    DataBinding 是 Google 在 Jetpack 中推出的一款数据绑定的支持库,利用该库可以实现在页面组件中直接绑定应用程序的数据源。使其维护起来更加方便,架构更明确简介。

    DataBinding 唯一的作用,也是他的使命,就是绑定数据,以及所有的支持库,本质上都是为了支持这个功能。绑定一词有两种解释,第一是将数据绑定在 UI 元素;第二是将 UI 上的数据绑定到对应的数据模型,还支持对数据及 UI 的变动观察,其中一个发生变动就需要同步到另一个上去。


    启用databinding

    首先设置使用 Databinding,在 app module 的 build.gradle 中添加如下代码即可:

    android {
        ...
        dataBinding {
            enabled = true
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    布局xml

    根结点必须为,只能存在一个和一个直接子View结点。

    variable (变量标签)

    变量的属性名name不能包含_下划线,否则再kt文件里会找不到变量,有时可能需要指定自定义类型,可以使用 import 语法来导入类,以及使用 alias 设置别名

        <data>
            <import type="com.example.databinding.Entity.User"/>
            <import type="com.example.databinding.Entity.user.User" alias="member"/>
            <variable
                name="user"
                type="User" />
            <variable
                name="member"
                type="member" />
        data>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当需要使用两个同名但不同包名的类,可以使用alias别名属性

    data (数据标签)

    它有个属性class,可以自定义DataBinding生成的类名及路径

        <data class="ObservableDataBinding"> </data>
    
    • 1

    @{}表达式

    运算符

    运算类型运算符
    算术运算符+ - / * %
    字符串连接运算符+
    逻辑运算符&&
    二元运算符&
    一元运算符+ - ! ~
    移位运算符>> >>> <<
    三元运算符== > < >= <=
    分组运算符()

    关键字

    instanceof
    
    字符、字符串、数字、null
    
    类型转换
    
    方法调用
    
    字段访问
    
    数组访问 []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    绑定普通数据

    DataBinding 可以绑定普通数据对象(非 Observable/LiveData)

    <data>
            <import type="java.lang.String"/>
            <variable name="content" type="String" />
    data>
    
    • 1
    • 2
    • 3
    • 4

    绑定可观察数据

    绑定可观察数据意味着当数据变化时 UI 会跟着一起变化,绑定可观察数据有三种方式:objects、fields 和 collections.

    对单个变量的绑定:fields

    对于一些数据类只需要其中几个字段支持可观察,那么可以使用这种方式来创建可观察数据

    data class User(
    	val name: ObservableField<String>,
        val likes: ObservableInt
    )
    
    • 1
    • 2
    • 3
    • 4

    基本数据类型直接使用对应的包装类

    基本数据类型包装类
    booleanObservableBoolean
    byteObservableByte
    charObservableChar
    shortObservableShort
    intObservableInt
    longObservableLong
    floatObservableFloat
    doubleObservableDouble

    引用类型使用带有泛型参数的 ObservableField 类来创建

    val name: ObservableField<String>
    
    • 1

    对集合的绑定:collections

    <data>
        <import type="android.databinding.ObservableList"/>
        <variable name="user" type="ObservableList"/>
    </data>
    <TextView android:text="@{user[index]}" ... />
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以直接使用 [] 运算符( list[0] )获取对应位置的元素

    绑定对象:objects

    需要绑定的数据实体类继承 BaseObservable

    class Person : BaseObservable() {
        @get:Bindable
        var country: String = ""
            set(value) {
                field = value
                notifyPropertyChanged(BR.country)
            }
        
        @get:Bindable
        var sex: String = ""
            set(value) {
                field = value
                notifyPropertyChanged(BR.sex)
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    需要支持可观察的数据上添加 @get:Bindable 注解,然后重写 set 方法,在其中调用 notifyPropertyChanged 方法表示更新该数据,BR 是自动生成的,包名跟当前包名一致,会根据 Bindable 注解的变量生成对应的值;也可以调用 notifyChange() 方法更新所有数据

    绑定 LiveData

    LiveData也支持数据绑定

    
    <layout>
        <data>
            <variable name="desc"
                type="androidx.lifecycle.MutableLiveData<String>" />
        data>
    ...
        <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
               android:layout_gravity="center_vertical"
               android:text="@{desc}" />
    layout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    我们可以直接将 LiveData 赋值给 text,然后绑定数据

    val desc = MutableLiveData<String>()
    binding.desc = desc
    
    • 1
    • 2

    双向绑定

    单向绑定是指数据变化后更新 UI,而双向绑定是指其中任意一个变化后都会同步更新到另一个。
    双向绑定使用 @={} 表达式来实现:

    <data>
        ...
            <variable
                name="input"
                type="androidx.databinding.ObservableField<String>" />
        </data>
    ...
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@={input}"/>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    原生js实现上拉加载和下拉刷新功能
    Ollama部署大模型并安装WebUi
    C++STL详解(七)哈希封装模拟实现unordered_set&unordered_map
    select 的使用
    【数据结构】搜索树 与 Java集合框架中的Set,Map
    数仓建模—埋点设计与管理
    Windows下Docker搭建Flink集群
    基于Springboot+Vue+Element实现汽车租赁系统
    【HTML/CSS篇】牛客题库练习
    mysql-强制InnoDB恢复
  • 原文地址:https://blog.csdn.net/qq_35892584/article/details/126012838
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号