当前位置: 首页 > news >正文

JetPack之DataBinding基础使用

目录

  • 一、简介
  • 二、使用
    • 2.1 使用环境
    • 2.2 xml文件绑定数据
    • 2.3 数据绑定的对象
      • 2.3.1 object
      • 2.3.2 ObseravbleField
      • 2.3.3 ObseravbleCollection
    • 2.4 绑定数据
  • 三、应用场景


一、简介

DataBinding是谷歌15年推出的library,DataBinding支持双向绑定,能大大减少绑定app逻辑与layout文件的“胶水代码”,例如setText、findViewById等代码。双向绑定,指的是将数据与界面绑定起来,当数据发生变化时会体现在界面上,反过来界面的内容变化也会同步更新到数据上,使用DataBinding能轻松实现MVVM模式。

DataBinding的由来:

在这里插入图片描述

注意:

1.DataBinding只是工具而已,并不单独属于某一个模式,大部分情况下MVVM都是使用DataBinding,小部分情况下MVP情况下也可以使用DataBinding。
2.MVVM模式的VM和JetPack的ViewModel组件库是两回事。


二、使用

2.1 使用环境

首先需要在build.gradle下启用dataBinding

android {compileSdk 34defaultConfig {......minSdk 29//启用viewBindingviewBinding{enabled true}//启用dataBinding//第一种方式dataBinding {enabled = true}//第二种方式dataBinding.enabled=true......

2.2 xml文件绑定数据

新建布局文件
在这里插入图片描述
右击出现提示,点击show Context Actions
在这里插入图片描述
转换成由DataBinding管理的布局文件
在这里插入图片描述
进入布局文件将布局和User关联起来,View--->Model

<?xml version="1.0" encoding="utf-8"?><!--layout是由DataBinding管理了,我们整个布局  -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"><data><!-- 不是通过反射--><!-- 生成setuser()函数--><variablename="user"type="com.myStudy.jetPackTest.dataBindingTest.User" /></data><!-- 上面的内容是DataBinding内部用的,安卓View体系不认识--><!-- 安卓  View体系的下面的所有内容会给安卓绘制--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--@=  View————Model --><TextViewandroid:id="@+id/dataBinding1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@={user.name}"android:textSize="20sp" /><TextViewandroid:id="@+id/dataBinding2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@={user.password}"android:textSize="20sp" /></LinearLayout>
</layout>

其中变量user作为被绑定的数据,type指向对应类

        <variablename="user"type="com.myStudy.jetPackTest.dataBindingTest.User" />

属性值通过"@={}"这样的语法表达方式和数据user实现绑定,本例中将TextView的text值设置为user对象的name了:

            android:text="@={user.name}"

2.3 数据绑定的对象

DataBinding中有三种不同的数据,object、field、collection

2.3.1 object

创建一个Model User
别忘了继承BaseObservable 和注解,BR处可能会报错,需要接下来和布局绑定在一起,make编译一下方可正常运行。

Observable是提供添加移除监听的一个java接口,DataBinding基于此接口提供了一个基础类BaseObserable,可以这样使用它,通过Bindale注解绑定一个getter,当属性发生改变在setter中发出通知,这样就实现了响应

public class User extends BaseObservable {private String name;private String password;public User(String name, String password) {this.name = name;this.password = password;}@Bindable   //BR里面标记生成  name数值标记public String getName() {return name;}@Bindable    //BR里面标记生成  password数值标记public String getPassword() {return password;}public void setName(String name) {this.name = name;notifyPropertyChanged(BR.name);//APT技术  BR文件}public void setPassword(String password) {this.password = password;notifyPropertyChanged(BR.password);//APT技术  BR文件}
}

2.3.2 ObseravbleField

public static class User2 {public final ObservableField<String> firstName =new ObservableField<>();public final ObservableField<String> lastName =new ObservableField<>();public final ObservableInt age = new ObservableInt();
}

2.3.3 ObseravbleCollection

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("Name", "Google");
user.put("password", "123456");
user.put("age", 17);

对应绑定的xml:

<data><import type="android.databinding.ObservableMap"/><variable name="user" type="ObservableMap<String, Object>"/>
</data><TextViewandroid:text='@{user["lastName"]}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>
<TextViewandroid:text='@{String.valueOf(1 + (Integer)user["age"])}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>
ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("123456");
user.add(17);

对应绑定的xml:

<data><import type="android.databinding.ObservableList"/><import type="com.example.my.app.Fields"/><variable name="user" type="ObservableList<Object>"/>
</data><TextViewandroid:text='@{user[Fields.LAST_NAME]}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>
<TextViewandroid:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>

2.4 绑定数据

创建一个Activity,让Use数据驱动UI,Model---->View

public class DataBindingTestActivity extends AppCompatActivity {User user;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);DatabindingtestBinding binding = DataBindingUtil.setContentView(this, R.layout.databindingtest);user = new User("name", "password");binding.setUser(user);//必须要建立联系,否则没有任何效果//Model---->Viewnew Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {try {Thread.sleep(1000);user.setName(user.getName() + "" + i);user.setPassword(user.getPassword() + "" + i);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}).start();}
}

测试一下:
在这里插入图片描述
与Activity绑定xml对比,整体示意图:
在这里插入图片描述

上述内容为DataBinding双向绑定的基础。DataBinding较为繁重,普通应用开发完全可以用ViewBinding替代。

DataBinding的优缺点:

优点

  • 简化开发:DataBinding 可以帮助开发者简化数据与 UI 元素之间的绑定,减少手动更新 UI 的工作,提高开发效率。
  • 减少重复代码:通过 DataBinding,可以避免编写大量的重复代码来手动更新 UI 元素,减少代码量,提高代码质量。
  • 实时更新:DataBinding 可以实现数据与 UI 元素的实时绑定,当数据发生变化时,UI 会自动更新,使得用户界面能够及时展示最新的数据。
  • 解耦视图和数据:DataBinding 有助于实现视图和数据的解耦,使得 UI 层和数据模型层之间的关系更加清晰,便于维护和扩展。
  • 提高可维护性:通过使用 DataBinding,可以使代码结构更清晰,逻辑更简洁,降低代码的耦合度,提高代码的可维护性。
    缺点
  • 学习曲线:对于初学者来说,DataBinding 技术可能需要一定的学习成本,需要掌握相关的概念和用法,可能会增加开发的复杂度。
  • 性能消耗:在某些情况下,使用 DataBinding 可能会引入一定的性能消耗,特别是在大规模数据绑定和频繁更新 UI 的情况下,可能会影响应用的性能。
  • 调试困难:由于 DataBinding 技术会将数据绑定到 UI 上,有时候会使得调试变得困难,特别是在数据与 UI 不一致的情况下,可能需要花费更多的时间来排查问题。
  • 不适用于所有场景:DataBinding 并不适用于所有场景,有些场景下可能并不需要使用 DataBinding 技术,过度使用可能会增加代码复杂度。

三、应用场景

实时数据展示:在需要实时展示数据变化的场景下,DataBinding 可以帮助实现数据与 UI 的实时绑定,使得数据的变化能够即时反映在界面上。例如,在股票行情展示、即时通讯应用等场景中都可以应用 DataBinding 技术。

MVVM 架构:DataBinding 技术通常与 MVVM(Model-View-ViewModel)架构一起使用,MVVM 架构通过 DataBinding 实现了视图与数据模型的解耦,使得界面逻辑更清晰,易于维护和扩展。

参考链接:
DataBinding使用全面详解
Android开发提升效率之DataBinding——基本使用

相关文章:

JetPack之DataBinding基础使用

目录 一、简介二、使用2.1 使用环境2.2 xml文件绑定数据2.3 数据绑定的对象2.3.1 object2.3.2 ObseravbleField2.3.3 ObseravbleCollection 2.4 绑定数据 三、应用场景 一、简介 DataBinding是谷歌15年推出的library,DataBinding支持双向绑定&#xff0c;能大大减少绑定app逻辑…...

设计模式学习笔记 - 设计原则与思想总结:2.运用学过的设计原则和思想完善之前性能计数器项目

概述 在 《设计原则 - 10.实战&#xff1a;针对非业务的通用框架开发&#xff0c;如何做需求分析和设计及如何实现一个支持各种统计规则的性能计数器》中&#xff0c;我们讲解了如何对一个性能计数器框架进行分析、设计与实现&#xff0c;并且实践了一些设计原则和设计思想。当…...

docker入门(八)—— dockerfile详细介绍,编写dockerfile

dockerfile&#xff08;重点&#xff09; 大家想想&#xff0c;Nginx&#xff0c;tomcat&#xff0c;mysql 这些镜像都是哪里来的&#xff1f;官方能写&#xff0c;我们不能写吗&#xff1f; 我们要研究自己如何做一个镜像&#xff0c;而且我们写的微服务项目打包上云部署&am…...

机器学习复习(9)——自定义dataset

目录 第一种dataset(文件夹名即为标签) 用于将格式&#xff08;1&#xff09;转换为格式&#xff08;2&#xff09; 第二种dataset(标签在labels文件夹下的对应的txt文件里面) 第一种dataset(文件夹名即为标签) 数据组织格式&#xff08;1&#xff09; --data ----train …...

【Redis】缓存穿透

问题发生背景&#xff1a;客户端请求的数据再缓存中和数据库中都不存在。 导致的问题&#xff1a;缓存永远不会生效&#xff0c;这些请求都会去请求数据库—导致数据库压力增大。 解决方案&#xff1a; 1.缓存空对象 在Redis中缓存空对象&#xff0c;告诉客户端数据库中没有该值…...

编程出现bug?怎么用Python打印异常

在 Python 编程中&#xff0c;异常是指程序执行过程中出现的错误或异常情况。当程序遇到异常时&#xff0c;为了更好地调试和定位问题&#xff0c;我们需要打印异常信息。本文将详细介绍如何在 Python 中打印异常&#xff0c;并提供一些示例和注意事项。 一、try-except 语句捕…...

P1958 上学路线

题目传送门&#xff1a;P1958 上学路线 一个DFS求迷宫的的题。 详细在代码里&#xff1a; #include <bits/stdc.h>using namespace std; int n,m,a[20][20],t,x,y,ans0; int dx[4]{0,1}; int dy[4]{1,0}; int flag[105][105]{0}; inline void dfs(register int x,regis…...

Android14之HIDL报错:Invalid sparse file format at header magic(一百九十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

旭日x3派目标跟随小车

目标跟随小车&#xff08;yolov5、安全帽识别&#xff09; 前言最终结果接线实现 前言 上板运行的后处理使用cython封装了&#xff0c;由于每个版本的yolo输出的形状不一样&#xff0c;这里只能用yolov5-6.2这个版本。 ①训练自己的模型并部署于旭日x3派参考&#xff1a; http…...

金潮实业邀您参观2024长三角快递物流展览会

展会介绍 本届展会致力于全面展示快递物流上下游领域的创新解决方案&#xff0c;涵盖快递物流供应链、智能装备、AGV机器人与无人搬运、自动识别、智慧仓储、智慧物流、无人配送、新能物流车及商用车、绿色包装、冷链物流等各个环节&#xff0c;为促进行业合作共融&#xff0c…...

【超细完整版】C# WebService 通过URL生成WSDL文件和DLL文件 【生成篇】

先学生成&#xff0c;再看调用哦 【超细完整版】C# 获取WebService所有方法并调用 【调用篇】 目的 支持通过web url (自适应“?wsdl”的有无) 生成.wsdl文件 和 .dll文件 实现 将通过一个类的三部分来实现这些功能 获取url中的ClassName &#xff08;GetClassNameFromUrl&a…...

申请公派访问学者难不难?

申请公派访问学者&#xff0c;对许多人来说是一项具有挑战性的任务。这需要充分的准备和计划&#xff0c;以确保申请能够顺利进行并最终获得批准。下面将探讨一些关于申请公派访问学者的问题以及应对策略。 首先&#xff0c;申请公派访问学者需要有一个明确的研究计划或合作意向…...

关于汽车中网改装需要报备吗?(第二天)

车联网改造需要申报吗&#xff1f; 今天2022年10月20日&#xff0c;小编就给大家介绍一下车联网改装是否需要申报的相关知识。 让我们来看看。 汽车格栅改装无需申报。 这种年检可以直接通过。 您不必担心&#xff0c;因为汽车格栅对于实车的外观来说并不陌生&#xff0c;因此…...

面试官:对于 Java 中多态的理解是什么?

面试官&#xff1a;对于 Java 中多态的理解是什么&#xff1f; 题目 面试官&#xff1a;对于 Java 中多态的理解是什么&#xff1f; 推荐解析 1.父类的引用指向子类的对象 子类重写父类的方法&#xff1a;子类可以继承父类的方法&#xff0c;并对其进行重写。当通过父类的…...

JUC-1M/75±5°超小型密封温度继电器 体积小、重量轻、控温精度高 JOSEF约瑟

JUC系列温度继电器 JUC-1M型超小型密封温度继电器 JUC-2M型超小型密封温度继电器 继电器JUC-027M/2531H-III-G温度继电器 JUC-1M 10C常开温度继电器 JUC-1M 105C温度继电器 用途 小型温控开关系接触感应式密封温度继电器&#xff0c;具有体积小、重量轻、控温精度高等特点&…...

filebeat 配置

主要就是证书的配置 ca_trusted_fingerprint: 产生方式 openssl x509 -fingerprint -sha256 -in /etc/elasticsearch/certs/http_ca.crt 产生的结果 SHA256 Fingerprint 中的冒号 替换掉就是我们想要的结果 ssl: enabled: true ca_trusted_fingerprint: "…...

Qt教程 — 3.5 深入了解Qt 控件:Display Widgets部件(1)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QLabel组件-显示图像或文本 2.2 QCalendarWidget组件-日历简单的使用 2.3 QLCDNumber组件-控件作时钟的显示 2.4 QProgressBar组件-模拟手机电池充电 2.5 QFrame组件-绘制水平/垂直线 Display Widgets将分…...

网络安全框架和云安全参考架构介绍

目录 一、网络安全框架 1.1 概述 1.2 IATF框架 1.2.1 框架来源 1.2.2 框架结构图 1.2.3 框架内容 1.2.3.1 人&#xff08;People&#xff09; 1.2.3.2 技术&#xff08;Technology&#xff09; 1.2.3.3 操作&#xff08;Operation&#xff09; 1.3 NIST网络安全框架 …...

360企业安全浏览器兼容模式显示异常某个内容不显示 偶发现象 本地无法复现情况js

360企业安全浏览器兼容模式显示异常 &#xff0c;现象测试环境频发 &#xff0c;本地连测试无法复现&#xff0c;线上反馈问题。 出现问题的电脑为windows且使用360企业安全浏览器打开兼容模式可复现 复现过程&#xff1a; 不直接点击超链接跳转页面 &#xff0c;登录后直接通…...

JVM常见启动参数

目录 内存参数设置 垃圾收集 内存溢出 其他杂项 总结 java虚拟机&#xff08;JVM&#xff09;的启动参数可以用来调整其行为、性能和资源分配。以下是一些常见的JVM启动参数&#xff1a; 内存参数设置 初始化堆内存以满足应用程序需求是最常见的与性能相关的实践之一。 …...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...