【Android】DataBinding的运用

引言

之前对databinding有了基础的运用与介绍,但databinding的用处不单单在于Text的绑定,接下来就一起看看吧!

意义:让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低。允许用户界面(UI)元素(如文本框、列表、按钮等)与数据源(如数据库、对象、XML 文件等)之间建立自动同步的双向或单向绑定关系。这种技术可以减少代码量,提高开发效率,并且使得数据的更新和UI的更新更加直观和自动化。

应用

基本应用

根据一个例子来理解吧!

  1. 新建一个活动,活动当中放置一个图片和两个TextView控件,我们之前为TextView设置内容都是在主活动当中先获取到控件,在使用setText()方法设置,现在我们试试不在活动当中,此时的布局文件大家都会写,在这里就不展示了
  2. 打开build.gradle文件,添加以下内容,注意不要忘记sync now

在这里插入图片描述

  1. 鼠标位于布局文件的最前端点击alt+回车,就会出现以下内容,我们需要添加红色边框部分内容

在这里插入图片描述

  • <data>:这个元素定义了布局文件中可以使用的数据源。
  • <variable:这个元素定义了一个变量,它可以在布局文件中被引用。
    • name="idol":这是变量的名称,在布局文件中可以通过这个名称来引用变量。
    • type="com.example.databinding.Idol":这是变量的类型,它指定了变量的数据类型。在这个例子中,Idol是一个Java类,它可能定义了一些属性,名字、等级,这些属性可以在布局文件中被绑定到UI组件上。
  1. 对主活动进行修改
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
Idol idol = new Idol("熊大", "五星");
activityMainBinding.setIdol(idol);
  • activityMainBinding:这是一个变量,它存储了绑定类的实例,可以通过这个变量访问布局文件中定义的视图和变量。
  • DataBindingUtil.setContentView:这是一个静态方法,用于将布局文件绑定到当前的Activity。它返回一个绑定类(在这个例子中是ActivityMainBinding)的实例,这个绑定类是由Data Binding库根据布局文件自动生成的。
  • setIdol:这是在ActivityMainBinding类中定义的一个方法,它用于将Idol对象绑定到布局文件中定义的变量idol上。
  1. 对布局文件进行修改

在这里插入图片描述

接下来运行程序:

在这里插入图片描述

Important标签和事件绑定

  1. Important标签

若在我们创建的时候有一个值为整型怎么办,例如在Idol当中将star设置为整型,此时我们就需要将整形转化为字符串类型,创建一个类

public class StarUtils {public static String getStar(int star) {switch (star) {case 1:return "一星";case 2:return "二星";case 3:return "三星";case 4:return "四星";}return "";}
}

修改xml文件

<data><variablename="idol"type="com.example.databinding.Idol" /><import type="com.example.databinding.StarUtils"/>
</data>
<TextViewandroid:id="@+id/dengji"android:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{StarUtils.getStar(idol.star)}"android:textSize="25sp" />

此时在创建对象的时候:

Idol idol = new Idol("熊大", 1);

运行程序,也会得到相应的结果。

  • <import>:这是Data Binding布局文件中的一个XML标签,用于导入Java类。
  • type:这是<import>标签的一个属性,用于指定要导入的类或包的全限定名。
  1. 与事件绑定

设置一个按钮,为点击按钮注册事件

public class EventHander {private Context context;public EventHander(Context context) {this.context = context;}public void buttonOnclick(View view) {Toast.makeText(context, "喜欢", Toast.LENGTH_SHORT).show();}
}

将这个类添加到绑定资源当中

<data><variablename="idol"type="com.example.databinding.Idol" /><variablename="eventbutton"type="com.example.databinding.EventHander" /><import type="com.example.databinding.StarUtils"/>
</data>

按钮控件进行添加绑定

android:onClick="@{eventbutton.buttonOnclick}"

此时运行程序,当按下按钮

在这里插入图片描述

二级页面的绑定

标签引用二级页面

在这里插入图片描述

我们将上面布局的按钮进行删除,将两个TextView控件放在一个xml文件之下,使主活动的xml文件引用这个xml文件,此时我们就不需要在一级页面将star进行转换,将Import标签进行删除,并对引用布局部分进行标签传递修改

<include layout="@layout/sub"app:idol="@{idol}"/>

在二级页面当中TextView的代码与之前的一级页面一样,注意不要忘记添加资源部分。

此时运行程序的结果与之前一样。

自定义BandingAdapter

BindingAdapter 是 Android Data Binding 库中的一个特性,它允许开发者定义自定义的绑定适配器,从而将属性或方法绑定到 XML 布局文件中的视图上。这些适配器可以用于处理视图的属性,如图片加载、文本格式化、视图可见性等,使得布局文件更加简洁,并且将视图逻辑与业务逻辑分离。

加载网络图片

接下来尝试自定义BandingAdapter加载网络图片:

使用DataBinding的必要操作就不再赘述了,我们在布局当中放置一个ImageView用来放置图片,制定一个BandingAdapter

public class ImageViewbindingAdapter {//加载网络图片@BindingAdapter("image")public static void setImage(ImageView imageView, String url) {if (!TextUtils.isEmpty(url)) {Picasso.get().load(url).placeholder(R.drawable.draw1).into(imageView);} else {imageView.setBackgroundColor(Color.GRAY);}}
}
  1. 添加方法注解

    • @BindingAdapter("image"):这个注解将 setImage 方法标记为一个 Binding Adapter,并且指定了一个绑定属性名 image。这意味着在 XML 布局文件中,你可以使用 app:image 属性来调用这个方法。
  2. 参数

    • ImageView imageView:这是一个 ImageView 对象的引用,它将被用来加载图片。
    • String url:这是一个字符串参数,代表要加载的图片的网络 URL。
  3. 方法逻辑

    • if (!TextUtils.isEmpty(url)):这个条件检查传入的 URL 是否为空或 null。TextUtils.isEmpty 是 Android 提供的一个工具方法,用于检查字符串是否为空。
    • Picasso.get().load(url):如果 URL 不为空,方法使用 Picasso 图片加载库来加载网络图片。Picasso 是一个流行的第三方库,用于简化图片的异步加载和缓存。

    使用 Picasso 图片加载库要添加依赖:

    implementation("com.squareup.picasso:picasso:2.71828")
    
    • .placeholder(R.drawable.draw1):这个方法链设置了一个占位图,它将在图片加载完成之前显示在 ImageView 上。R.drawable.draw1 应该是一个有效的资源 ID,指向你的应用资源中的一个图片文件。
    • .into(imageView):最后,into 方法将加载的图片绑定到传入的 ImageView 上。
    • else 分支:如果 URL 为空,方法将 ImageView 的背景色设置为灰色,这提供了一种默认的视觉反馈。

看看布局文件的修改:

<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><variablename="networkImage"type="String" /></data><LinearLayoutandroid:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><ImageViewandroid:id="@+id/image"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center"app:image="@{networkImage}" /></LinearLayout>
</layout>

主活动中的代码:

ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
activityMainBinding.setNetworkImage("https://i-blog.csdnimg.cn/direct/97ca7ca4a5bb430b829b0d03b3a00887.png#pic_center");

调用逻辑

  1. 设置内容视图: 在你的 Activity 中,你使用 DataBindingUtil.setContentView 方法来设置内容视图,这个方法会解析布局文件并创建相应的视图绑定类 ActivityMainBinding
  2. 绑定数据: 通过 activityMainBinding.setNetworkImage(...) 方法,你将网络图片的 URL 传递给绑定类。这里的 setNetworkImage 方法应该是在绑定类中定义的,用于设置 networkImage 变量的值。
  3. 数据绑定: 当 networkImage 变量的值被设置后,Data Binding 库会自动将这个值传递给 ImageViewapp:image 属性。
  4. 图片加载: 由于 ImageViewapp:image 属性绑定到了 networkImage 变量,当变量的值发生变化时,Data Binding 库会调用 setImage 方法来加载图片。setImage 方法会检查 URL 是否为空,如果不为空,则使用 Picasso 加载图片,并设置一个占位图。
  5. 错误处理: 如果 URL 为空,setImage 方法会将 ImageView 的背景色设置为灰色,作为错误或占位的指示。

加载本地图片

相信你已经大致知道如何对代码进行修改

首先对布局文件进行修改:

//添加文件引用变量
<variablename="LocalImage"type="int" />
//此时控件的引用进行修改
app:image="@{LocalImage}"

对BandingAdapter进行修改,此时我们传入的数据一个发生了变化,从而使用方法的重载:

@BindingAdapter("image")
public static void setImage(ImageView imageView, int resID) {imageView.setImageResource(resID);
}

在主活动当中将本地图片传入:

activityMainBinding.setLocalImage(R.drawable.draw2);

此时运行程序:

在这里插入图片描述

此时图片就加载上去了

选择性添加

我们若是要先加载网络图片,当网络图片为空,我们想再加载本地图片,则我们就可以添加注解时添加两个:

布局文件:

<ImageViewandroid:id="@+id/image"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center"app:image="@{networkImage}"app:default="@{LocalImage}"/>

在BandingAdapter类当中:

先来看看注解:

在这里插入图片描述

我们可以看到原本定义的就是字符串类型,requireAll()代表的是所有在 value 数组中指定的属性都必须有有效的值。如果任何一个属性没有被赋值,那么绑定方法将不会被执行,如果任何一个属性没有被赋值,那么绑定方法将不会被执行。源代码默认为true,我们将其设置为false,即无需对注解所需的数据都进行传入

@BindingAdapter(value = {"image","default"}, requireAll = false)
public static void setImage(ImageView imageView, String url, int resID) {if (!TextUtils.isEmpty(url)) {Picasso.get().load(url).placeholder(R.drawable.draw1).into(imageView);} else {imageView.setImageResource(resID);}
}

此时运行程序:

在这里插入图片描述

网络图片就加载出来了,当我们将绑定网络图片代码删除,就会加载本地的图片。

文章到这里就结束了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1542908.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机的错误计算(一百零一)

摘要 展示 在0附近数的函数值的计算精度问题。 计算机的错误计算&#xff08;一百&#xff09;探讨了 在一般情形下的计算精度问题。本节讨论其在0附近的数的函数值的计算精度问题。 例1. 已知 计算 不妨在Python 3.12.5下计算&#xff0c;则有 若在线运行R代码&#x…

使用 Higress AI 插件对接通义千问大语言模型

前言 什么是 AI Gateway AI Gateway 的定义是 AI Native 的 API Gateway&#xff0c;是基于 API Gateway 的能⼒来满⾜ AI Native 的需求。例如&#xff1a; 将传统的 QPS 限流扩展到 token 限流。将传统的负载均衡/重试/fallback 能力延伸&#xff0c;支持对接多个大模型厂…

0基础学习PyTorch——最小Demo

大纲 环境准备安装依赖 训练和推理训练生成数据加载数据TensorDatasetDataLoader 定义神经网络定义损失函数和优化器训练模型 推理 参考代码 PyTorch以其简洁直观的API、动态计算图和强大的社区支持&#xff0c;在学术界和工业界都享有极高的声誉&#xff0c;成为许多深度学习爱…

C++入门基础知识80(实例)——实例5【查看 int, float, double 和 char 变量大小】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 实例 【查看 int, float, double 和 c…

vue源码分析(九)—— 合并配置

文章目录 前言1.vue cli 创建一个基本的vue2 项目2.将mian.js文件改成如下3. 运行结果及其疑问&#xff1f; 一、使用 new Vue 创建过程的 2 种场景二、margeOption的详细说明1.margeOption的方法地址2.合并策略的具体使用3.defaultStrat 默认策略方法 三&#xff1a;以生命周期…

9.sklearn-K-means算法

文章目录 环境配置&#xff08;必看&#xff09;头文件引用K-means算法1.简介2.API3.代码工程4.运行结果5.模型评估6.小结优缺点 环境配置&#xff08;必看&#xff09; Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章&#xff0c;本专栏深度学习相关的版本和配置&…

idea使用spring initializr快速创建springboot项目

idea使用spring initializr快速创建springboot项目 1.打开idea&#xff0c;新建项目如图&#xff0c;选择好java版本&#xff0c;我这里是17。2.点击next&#xff0c;首先选择springboot版本&#xff0c;我这里选择3.3.4。勾选springweb&#xff0c;它会帮我们下载关于springmv…

【machine learning-14-特征缩放-归一化】

特征缩放是提升线性回归收敛速度的技巧&#xff0c;什么是特征缩放&#xff1f; 又是什么场景下需要特征缩放&#xff0c;有哪些特征缩放的方法呢&#xff1f; 特征值差异 我们还是以之前房间预测为例&#xff1a; 这里面是特征房屋大小 房间数目 与房价的关系 本文为简化…

数据处理与统计分析篇-day03-python数据分析介绍与环境搭建

概述 python优势 Python作为当下最为流行的编程语言之一 可以独立完成数据分析的各种任务 数据分析领域里有海量开源库 机器学习/深度学习领域最热门的编程语言 在爬虫&#xff0c;Web开发等领域均有应用 常用开源库 numpy NumPy(NumericalPython) 是 Python 语言的一…

#面试系列-腾讯后端一面

03.腾讯后端一面 项目相关 面试官可能是 Go 方向的&#xff0c;我面试的是 Java 方向的&#xff0c;所以面试官也没有问我简历上的项目&#xff0c;主要问了实验室中做的项目&#xff0c;哪个项目比较有技术挑战&#xff1f; 面试主要问了计算级网络相关&#xff0c;以及如果让…

通信工程学习:什么是TLS传输层安全协议

TLS&#xff1a;传输层安全协议 TLS&#xff08;Transport Layer Security&#xff09;传输层安全协议是一种用于在两个通信应用程序之间提供保密性、数据完整性以及真实性的安全协议。它是SSL&#xff08;Secure Sockets Layer&#xff09;协议的后继者&#xff0c;继承并增强…

数据结构与算法——Java实现 8.习题——移除链表元素(值)

祝福你有前路坦途的好运&#xff0c;更祝愿你能保持内心光亮 纵有风雨&#xff0c;依然选择勇敢前行 —— 24.9.22 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示…

黎巴嫩BP机爆炸事件启示录:我国应加快供应链安全立法

据报道&#xff0c;当地时间9月17日下午&#xff0c;黎巴嫩首都贝鲁特以及黎巴嫩东南部和东北部多地都发生了BP机爆炸事件。当时的统计数据显示&#xff0c;爆炸造成9人死亡&#xff0c;约2800人受伤。9月18日&#xff0c;死亡人数上升到11人&#xff0c;受伤人数超过4000。 目…

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

知乎:从零开始做自动驾驶定位; 注释详解(二)

这个个系统整体分为: 数据预处理 前端里程计 后端优化 回环检测 显示模块。首先来看一下数据预处理节点做的所有事情&#xff1a; 数据预处理节点 根据知乎文章以及代码我们知道: 节点功能输入输出数据预处理1.接收各传感器信息2.传感器数据时间同步 3.点云运动畸变补偿 4.传…

c++类与对象一

C类与对象(一) 面向对象初步认识 在c语言中&#xff0c;编程是面向过程编程&#xff0c;注重求解问题列出过程&#xff0c;然后调用函数求解问题。 在日常生活中。我们经常会遇到面向过程的问题 手洗衣服就是面向过程 而C是基于面向对象的。关注的是对象&#xff0c;把事情…

html实现TAB选项卡切换

<!DOCTYPE html> <html> <head> <title>选项卡示例</title> <style> .tabs { overflow: hidden; /* 防止选项卡溢出容器 */ border: 1px solid #ccc; background-color: #f1f1f1; } .tab-links { margin: 0; padding: 0; l…

DataX-Web项目的Windows环境部署及基本使用

一,datax-web是什么? DataX Web 是一个在 DataX 基础上开发的分布式数据同步工具,它提供了一个简单易用的操作界面,旨在降低用户使用 DataX 的学习成本,缩短任务配置时间,并减少配置过程中的错误。DataX Web 支持多种数据源,包括 RDBMS、Hive、HBase、ClickHouse、Mongo…

yarn : 无法加载文件 C:\Users\Rog\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本

yarn : 无法加载文件 C:\Users\Rog\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 设置命令行窗口默认以管理员身份运行&#xff0c;在此基础上输入以下代码&#xff0c;应该就好使了&#xff0c;切记&#xff0c;以下代码才是关键&#xff0c;我基本上…

<刷题笔记> 力扣236题——二叉树的公共祖先

236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 题目解释&#xff1a; 我们以这棵树为例&#xff0c;来观察找不同的最近公共祖先有何特点&#xff1a; 思路一&#xff1a; 除了第二种情况&#xff0c;最近公共祖先满足&#xff1a;一个节点在他的左边&am…