Android基础入门:dataBinding的简单使用

article/2025/8/6 2:09:37

image-20220602080856696

1.2修改布局文件


选中布局文件的第一行,按alter+enter就会弹出提示,默认选中data binding layout

AndroiddataBinding

image-20220602140306689

改造好的的新的布局文件里最大的变化就是多了一对<data></data>标签;很容易想到这是为了实现布局文件里数据和布局的分离,以及更好的实现数据与视图的双向绑定(这里文章后面会慢慢介绍)

image-20220602142624501

1.3修改Activity方法


修改好布局文件之后,还需要对Activity文件做修改

使用了dataBinding之后,编译器会自动帮我们生成一个类名+Binding的新类,这其实是编译器帮我们把布局文件转换成了一个java文件,可以看到我们通过ctrl+鼠标左键点击这个类可以直接访问到布局文件

image-20220602140519092

AndroiddataBinding2

除此之外还需要为mainBinding这个对象赋初值,同样是通过setContentView方法,不过要传入两个参数,前者是Activity类,后者是布局文件的id


mainBinding=DataBindingUtil.setContentView(this,R.layout.activity_main);

image-20220602141039360

image-20220602081156094

2.DataBinding的使用

===================================================================================

2.1属性更新


那么如何使用dataBingding呢?

我们先在布局文件中新建几个控件,这里我的两个控件:文本控件的id是textview,按钮控件的id是button

image-20220602141418203

回到Activity中,我们通过mainBInding对象可以看到,其下有两个值,textViewbutton,这正是我们刚刚两个组件的id,所以通过mainBinding对象我们可以轻松的取到我们布局文件里的组件,不再需要findViewById

通过mainBinding获取到组件同样的可以设置这些控件的各种属性

image-20220602142247143

2.2<data>标签


之前有提到在<data></data>标签中定义数据

<androidx.constraintlayout.widget.ConstraintLayout>中定义布局并且绑定数据,这类似于前端vue框架中的数据视图双向绑定

2.2.1简单数据的定义与绑定

那么如何在data标签中定义数据呢?

通过标签,定义数据的名字name和类型type,这个类型可以是java中的所有基本类型

image-20220602144940501

然后到布局中,用插值表达式将数据替代掉

image-20220602145243458

不过现在什么也不会显示,因为这两个变量只定义了,没有赋值

image-20220602145419501

看到这,我们也明白data标签的好处之一了,数据的定义都在data标签中,而constraint中就只管布局,通过插值表达式来绑定数据,不会出现数据。

那么data标签里的数据又如何初始化赋值呢?

这部分逻辑操作就交给Activity了。每定义一个varible,在布局的Binding类中都会生成此变量的get和set方法,通过这两个方法我们对数据进行初始化和更新。

image-20220602145847676

image-20220602150141004

所以有了dataBinding我们极大的减轻了Activity所要做的操作,Activity可以更专注于对数据与逻辑的处理,而UI的获取与数据和UI的绑定都交给了布局文件。

2.2.2复杂数据的定义与绑定

我们尝试一下类类型的数据的定义与绑定

先定义一个简单的实体类,简单的写两个属性

image-20220602150900388

在data中定义一个类变量,name属性的同样是这个变量的名字,type属性就是这个包名.类名

image-20220602151129993

数据的绑定也是一样的,通过类变量的名字.属性,所以我们可以把类变量person看成Person类new 出来的一个对象

image-20220602151424656

回到Activity中对类变量进行初始化,运行可以看到UI上的数据已经更新了

image-20220602152029525

2.3事件绑定


dataBinding可以把事件以数据的形式绑定到布局文件中

2.3.1点击事件绑定

首先我们在Activity中定义一个内部类

image-20220602152649237

然后在data标签中定义这个内部类的变量

image-20220602152748209

通过onClick属性实现事件的绑定,值得注意的是myclick.onClick方法后没有括号;这样简单的几行代码就实现了事件的绑定。用户每点击一次按钮都会调用MyClick类中的onClick()方法

android:onClick="@{myclick.onClick}"

image-20220602152950737

而Activity只需要做的事情就是初始化这个点击事件。因为此时事件已经被当成数据在使用了,通过set方法设置Myclick的值即可。然后打印日志查看运行效果


mainBinding.setMyclick(new MyClick());

image-20220602153418460

可以看到每点击一次按钮都会打印一次日志,说明调用成功

image-20220602153650965

2.3.2点击事件回传数据

我们看到onClick()方法中,我们传入的是view参数,那可以传其他参数吗?


public class MyClick{public void onClick(View view){Log.i("myclick", "onClick: 点赞成功!");}}

当然是可以的而且我们是通过这一种方法事件点击回传数据。如我们把Person作为参数传入,并绑定点击事件,那么用户点击按钮,又可以将数据传回到Activity中。

改造一下onClick()方法,传入参数改为Person

image-20220602155027810

并在布局文件中重新绑定,这里绑定事件也有点不同了,需要用到lambda表达式


android:onClick="@{()->myclick.onClick(person)}"

image-20220602155110852

点击按钮,可以看到把person中的数据传了回来;

image-20220602154925534

2.3.3动态改变对象数据在控件上显示

默认情况下,在点击事件监听方法中修改person对象的值并不会修改数据在控件上的显示

image-20220604205309233

如果我们要实现事件监听动态去改变控件上的数据的话,我们需要对Person类动一动手脚

让Person类继承BaseObservable类,并为每个属性生成get和set方法

image-20220604205729905

在点击事件监听方法中通过调用set方法设置新的值,来修改person对象的值并在控件上的显示

AndroiddataBinding3

2.3.4动态改变基本数据在控件上显示

首先在Activity中定义一个name变量,不过需要使用ObservableField类包装

image-20220604212240287

其后在data标签中定义一个name变量,并将其绑定在一个新的文本控件上。

这里值得注意的是在<>符号里不能再出现<>,所以我们使用转义符&lt;&gt;

image-20220604212453661

最后在单击事件方法中更新name的值,这个值就会动态的更新在界面上

image-20220604212559085

AndroiddataBinding4

2.4与输入控件结合


首先在界面中添加一个新的输入控件,并为其绑定一个变量,这里我就绑定name变量。那么我们刚刚把name变量绑定在一个文本控件上,现在又把name绑定在一个输入控件上。那么我们在输入控件中对name变量的改变会及时更新显示在文本控件上吗?

image-20220604213107804

image-20220604213200235

当然是可以的不够我们的数据绑定要做一个小小的修改,仅仅添加了一个等于符号,那这个实时输入显示的功能就实现啦!!!

android:text="@={name}"

image-20220604213625115

动图看一下效果

AndroiddataBinding5

2.5与图片控件结合


通过dataBinding和imageView和Glide的结合使用,可以很方便的加载一张网络图片

第一步我们还是先在布局文件中添加一个图片控件

image-20220604214416733

然后添加Glide依赖和网络请求权限

//引入第三方库glideimplementation 'com.github.bumptech.glide:glide:4.13.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0'

image-20220604214727257

然后再Activity中创建一个静态的公共的方法,传入imageView和网络图片的url两个参数;并为其添加一个注解BindingAdapter()


@BindingAdapter("imageUrl")public static void bindImageUrl(ImageView view,String url){

http://www.hkcw.cn/article/KjtvddIOQf.shtml

相关文章

在Android设置界面中实现颜色选择器

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;在Android开发中&#xff0c;颜色选择器是设置界面中实现用户自定义界面主题色或字体颜色的常用功能。本教程详细介绍了如何设计颜色选择器布局&#xff0c;通过 GridView 或 RecyclerView 展示颜色列表&am…

小程序微信认证/年审流程

看清楚文字描述&#xff0c;别光看图&#xff0c;图并不一定准确&#xff0c;按照你想填写的填写、&#xff0c;本教程只是提供一个参考。 1.登录微信公众平台 : 微信公众平台【← ←点击这个蓝色字体】&#xff08;选择正确的小程序&#xff09;&#xff0c;或者根据第三方…

macOS版本微信 4.0 之后,双开策略

从 macOS 版本微信 3.0 升级到 4.0 之后&#xff0c;之前的双开策略实效了。 当然期待微信能够让之前方法回归。这是最理想的。 咱也该自己动手丰衣足食 &#xff5e;&#xff5e;&#xff5e; 第一步 创建微信的「分身」 sudo cp -R /Applications/WeChat.app /Applicati…

EasyPlayer-RTSP-Android:一款强大的流媒体播放器

EasyPlayer-RTSP-Android&#xff1a;一款强大的流媒体播放器 【下载地址】EasyPlayer-RTSP-Android一款强大的流媒体播放器 EasyPlayer-RTSP-Android 是一款功能强大的 Android 流媒体播放器&#xff0c;支持 RTSP、RTMP、HLS 和 HTTP 等多种协议&#xff0c;适用于各种音视频…

mac怎么安装pycharm?

安装步骤&#xff1a;1、打开PyCharm官网&#xff0c;在官网首页点击“下载”按钮&#xff0c;选择“MacOS”版本进行下载&#xff1b;2、双击打开安装包&#xff0c;将PyCharm拖动到应用程序文件夹中&#xff1b;3、根据提示进行安装&#xff0c;在第一次运行PyCharm时&#x…

【工具】Raycast – Mac提效工具

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 引入 以前看到同事们锁屏的时候,不知按了什么键,直接调出这个框,然后输入lock屏幕就锁了。 跟我习惯的按Mac开机键不大一样。个人觉得还…

【实测可用】Sublime Text4 4169 mac/windows 破解注册 20240417 实测可用

官网下载Sublime Text4 官网地址&#xff1a;https://www.sublimetext.com/ 点击下载即可 不用安装&#xff0c;可以直接使用。 MAC 破解注册 修改可执行文件sublime_text 打开网站https://hexed.it/。找到sublime所在目录&#xff0c;比如我这里是&#xff1a;/Users/xxx/s…

小程序快速实现大模型聊天机器人

需求分析&#xff1a; 基于大模型&#xff0c;打造一个聊天机器人&#xff1b;使用开放API快速搭建&#xff0c;例如&#xff1a;讯飞星火&#xff1b;先实现UI展示&#xff0c;在接入API。 最终实现效果如下&#xff1a; 一.聊天机器人UI部分 1. 创建微信小程序&#xff0c…

iOS全能签使用全攻略

适用系统&#xff1a;iOS 12及以上设备 全能签是一款免费免越狱的IPA签名工具&#xff0c; 支持一键签名、多开安装、插件注入等功能&#xff0c;无需联网即可使用。 哈士奇软件源&#xff08;解锁更多资源&#xff09;&#xff1a;https://yuan.ioska.cn/appstore &#xff0…

手把手教你在VMware虚拟机安装macOS(含避坑指南)

文章目录 ▍前期准备&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09;必备三件套&#xff1a;避坑提醒&#xff1a; ▍详细安装步骤步骤1&#xff1a;安装Unlocker补丁步骤2&#xff1a;创建虚拟机步骤3&#xff1a;修改虚拟机配置文件步骤4&#xff1a;安装…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

Android Studio 历史版本下载

Android Studio 历史版本下载 官方链接&#xff1a;https://developer.android.google.cn/studio/archive 通过gradle插件版本反查Android Studio历史版本 Android Studio Meerkat | 2024.3.1 【https://r1—sn-j5o76n7e.gvt1-cn.com/edgedl/android/studio/install/2024.3.…

有手就行 | Flutter在VSCode(Visual Studio Code)中的安装与配置

目录 一、前言二、资料参考三、版本参考四、Flutter在Visual Studio Code中的安装与配置&#xff08;一&#xff09;下载Flutter插件及SDK&#xff08;二&#xff09;检查开发配置及问题解决&#xff08;1&#xff09;通过代理解决&#xff08;2&#xff09;通过镜像网站解决 五…

任务21:天气信息大屏说明及流程

任务描述 1. 大屏制作流程 1&#xff09;创建DJango项目 2&#xff09;读取MySQL数据&#xff0c;并参照ECharts图形的数据格式进行处理 3&#xff09;参照对照模板、ECharts官网配置项手册及示例&#xff0c;将相应的ECharts图形绘制到大屏对应的容器中。 2. 大屏制作说明…

精英-探索双群协同优化(Elite-Exploration Dual Swarm Cooperative Optimization, EEDSCO)

一种多群体智能优化算法&#xff0c;其核心思想是通过两个分工明确的群体——精英群和探索群——协同工作&#xff0c;平衡算法的全局探索与局部开发能力&#xff0c;从而提高收敛精度并避免早熟收敛。 一 核心概念 在传统优化算法&#xff08;如粒子群优化、遗传算法&#xf…

Go 即时通讯系统:客户端与服务端 WebSocket 通信交互

客户端和服务端的交互 客户端与服务端建立连接 客户端&#xff1a;客户端通过浏览器或者其他应用程序发起一个 HTTP 请求到服务端的 /socket.io 路径。在请求中会携带用户的 UUID 作为参数&#xff08;通过 c.Query("user") 获取&#xff09;。 // router/socket.…

Python 训练营打卡 Day 41

简单CNN 一、数据预处理 在图像数据预处理环节&#xff0c;为提升数据多样性&#xff0c;可采用数据增强&#xff08;数据增广&#xff09;策略。该策略通常不改变单次训练的样本总数&#xff0c;而是通过对现有图像进行多样化变换&#xff0c;使每次训练输入的样本呈现更丰富…

什么是模块化设计?模块和微服务是一样?

软件的模块化设计和微服务是两种不同层次的概念&#xff0c;它们有相似之处但并非等同。以下是详细解释&#xff1a; 一、软件的模块化设计&#xff08;Modular Design&#xff09; 定义 模块化设计是指将一个复杂的软件系统拆分为多个相对独立的模块&#xff08;Module&…

基于千帆大模型的AI体检报告解读系统实战:使用OSS与PDFBox实现PDF内容识别

目录 说明 前言 需求 流程说明 表结构说明 整体流程 百度智能云 注册和实名认证 创建应用 费用说明 大模型API说明 集成大模型 设计Prompt 上传体检报告 读取PDF内容 功能实现 智能评测 抽取大模型工具 功能实现 总结 说明 AI体检报告解读、病例小结或者…

PySide6 GUI 学习笔记——常用类及控件使用方法(标签控件QLabel)

文章目录 标签控件QLabel及其应用举例标签控件QLabel的常用方法及信号应用举例Python 代码示例1Python 代码示例2 小结 标签控件QLabel及其应用举例 QLabel 是 PySide6.QtWidgets 模块中的一个控件&#xff0c;用于在界面上显示文本或图像。它常用于作为标签、提示信息或图片展…