【Android】DataBinding的运用

news2024/12/27 1:22:49

引言

之前对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>
    <variable
        name="idol"
        type="com.example.databinding.Idol" />
    <import type="com.example.databinding.StarUtils"/>
</data>
<TextView
    android: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>
    <variable
        name="idol"
        type="com.example.databinding.Idol" />
    <variable
        name="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>
        <variable
            name="networkImage"
            type="String" />
    </data>

    <LinearLayout
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <ImageView
            android: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 的背景色设置为灰色,作为错误或占位的指示。

加载本地图片

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

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

//添加文件引用变量
<variable
    name="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);

此时运行程序:

在这里插入图片描述

此时图片就加载上去了

选择性添加

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

布局文件:

<ImageView
    android: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.coloradmin.cn/o/2156183.html

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

相关文章

Maven-一、分模块开发

Maven进阶 文章目录 Maven进阶前言创建新模块向新模块装入内容使用新模块把模块部署到本地仓库补充总结 前言 分模块开发可以把一个完整项目中的不同功能分为不同模块管理&#xff0c;然后模块间可以相互调用&#xff0c;该篇以一个SSM项目为目标展示如何使用maven分模块管理。…

操作系统之I/O设备管理

I/O系统的组成 I/O系统的结构 微机I/O系统 总线型I/O系统结构,CPU与内存之间可以直接进行信息交换&#xff0c;但是不能与设备直接进行信息交换&#xff0c;必须经过设备控制器。 主机I/O系统 I/O系统可能采用四级结构&#xff0c;包括主机、通道、控制器和设备。一个通道…

神经网络面试题目

1. 批规范化(Batch Normalization)的好处都有啥&#xff1f;、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是&#xff1a;A 解析&#xff1a; ‌‌‌‌  batch normalization 就…

TikTokDownloader 开源项目操作教程

TikTokDownloader TikTokDownloader 是一个开源的多功能视频下载工具&#xff0c;它专门用于从抖音和TikTok平台下载无水印的视频、图集和直播内容。这个工具支持批量下载账号作品、收藏内容&#xff0c;并可以采集详细数据。它提供了命令行和Web界面&#xff0c;具有多线程下…

图像处理基础知识点简记

简单记录一下图像处理的基础知识点 一、取样 1、释义 图像的取样就是图像在空间上的离散化处理,即使空间上连续变化的图像离散化, 决定了图像的空间分辨率。 2、过程 简单描述一下图象取样的基本过程,首先用一个网格把待处理的图像覆盖,然后把每一小格上模拟图像的各个…

re题(38)BUUCTF-[FlareOn6]Overlong

BUUCTF在线评测 (buuoj.cn) 运行一下.exe文件 查壳是32位的文件&#xff0c;放到ida反汇编 对unk_402008前28位进行一个操作&#xff0c;我们看到运行.exe文件的窗口正好是28个字符&#xff0c;而unk_402008中不止28个数据&#xff0c;所以猜测MessageBoxA&#xff08;&#x…

十一、 JDK17 新特性梳理

文章目录 为什么是JDK17语法层面新特性1、文本块2 、Switch 表达式增强3、instanceof的模式匹配4、var 局部变量推导 模块化及类封装1、记录类 record2 、隐藏类 Hidden Classes3 、密封类 Sealed Classes4、模块化 Module System1 、什么是模块化2、声明一个module3 、require…

从零开始讲DDR(4)——Xilinx方案

本文依据的是xilinx的PG150文档&#xff0c;主要介绍的是xilinx的ultrascale系列中内存资源的使用。 一、方案概述 Xilinx UltraScale™架构中的DDR3/DDR4 SDRAM ip核旨在支持高性能的内存接口解决方案。这些ip可以用于将DDR3和DDR4 SDRAM内存类型集成到设计中&#xff0c;提供…

干货 | 2024数智新时代制造业数字化创新实践白皮书(免费下载)

导读&#xff1a;本白皮书将对制造业发展历程、现状、趋势与核心难题做深入解读&#xff0c;并在此基础上提出了相应的制造行业解决方案,结合业内实践成功的客户案例来详析信息化转型的有效方法&#xff0c;以供生产制造行业的从业者参考交流。

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

解决SVN蓝色问号的问题

桌面或文件夹右键&#xff0c;选择TortoiseSVN->Settings打开设置对话框&#xff0c;选择Icon Overlays->Overlay Handlers->取消钩选Unversioned。确定&#xff0c;重启系统即可

扫码挪车是怎么实现的呢?一篇文章带你了解一下!扫码挪车小程序基础版上线了!!!

挪车小程序系统源码的功能特点 快速定位与挪车请求&#xff1a;车主通过小程序可以快速定位车辆位置&#xff0c;并发送挪车请求。系统会自动将请求发送给附近的车主&#xff0c;提醒其尽快挪车。实时通信与交互&#xff1a;小程序支持实时通信功能&#xff0c;车主之间可以通…

【安当产品应用案例100集】017-助力软件服务商高效集成多因素认证

一、企业案例背景 在本案例中&#xff0c;某企业作为一家软件技术服务商&#xff0c;为包括银行、政府机构在内的多个行业提供定制化的软件服务。由于各个行业的安全需求各异&#xff0c;例如银行和政府机构倾向于使用UKEY进行身份验证&#xff0c;而其他企业则可能偏好使用数…

[Python学习日记-26] Python 中的文件操作

[Python学习日记-26] Python 中的文件操作 简介 操作模式 循环文件 其他功能 混合模式 修改文件 简介 在 Python 中的文件操作其实和我们平时使用的 Word 的操作是比较类似的&#xff0c;我们先说一下 Word 的操作流程&#xff0c;流程如下&#xff1a; 找到文件&#x…

Leetcode Hot 100刷题记录 -Day19(回文链表)

回文链表 问题描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff…

UnLua访问C++属性、动态生成Actor

一、访问C属性、动态生成Actor 1、在C类MyBaseActor中新增蓝图可编辑属性:Name public:UPROPERTY(EditAnywhere)FString Name;2、在继承自C的蓝图子类BP_BaseActor中给Name赋值 3、在Lua中实现点击按钮动态生成Actor,并访问其Name属性 function WBP_FirstLua_C:Construct()s…

FreeRTOS下UART的封装

FreeRTOS下UART的封装_哔哩哔哩_bilibili Git使用的一个BUG&#xff1a; 当出现这个问题是因为git本身的安全证书路径有问题&#xff0c;我们需要重新指定路径 P1:UART程序层次

AIGC时代算法工程师的面试秘籍(第二十二式2024.9.2-9.15) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试经验&#xff0c;力求让读者在获得心仪offer的同时&#xff0c;增强技术基本面。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky…

【VLM小白指北 (1) 】An Introduction to Vision-Language Modeling

开一个新坑Vision-Language Modeling (VLM) &#xff0c;原文76页&#xff0c;慢慢更&#xff0c;for beginners&#xff0c;但也不能之前啥都不会啊。 原文链接&#xff1a;An Introduction to Vision-Language Modeling Introduction 存在的问题&#xff1a;将语言与视觉相…

制造解法 Manufactured Solutions 相关的论文的阅读笔记

Verification of Euler/Navier–Stokes codes using the method of manufactured solutions https://doi.org/10.1002/fld.660 粘性项与扩散项之间的平衡 For the Navier–Stokes simulations presented herein, the absolute viscosity is chosen to be a large constant va…