深入解析 androidx.databinding.Bindable 注解

在这里插入图片描述

在现代 Android 开发中,数据绑定 (Data Binding) 是一个非常重要的技术。它使得我们能够简化 UI 和业务逻辑之间的连接,从而提高代码的可读性和维护性。在数据绑定中,@Bindable 注解是一个关键部分,它帮助我们实现双向数据绑定和自动更新视图。本文将深入解析 androidx.databinding.Bindable 注解的使用和原理。

什么是 @Bindable 注解?

@Bindable 注解用于标记一个属性,使得这个属性可以被数据绑定框架观察。当这个属性的值发生变化时,数据绑定框架会自动更新相关的 UI 视图。这个注解通常与 BaseObservable 类或 Observable 接口一起使用。

基本用法

创建一个绑定类

首先,我们需要创建一个继承自 BaseObservable 的类,并在需要绑定的属性上添加 @Bindable 注解。例如,我们创建一个 User 类来演示数据绑定:

import androidx.databinding.BaseObservable
import androidx.databinding.Bindable

class User : BaseObservable() {
    var firstName: String = ""
        @Bindable get() = field
        set(value) {
            field = value
            notifyPropertyChanged(BR.firstName)
        }

    var lastName: String = ""
        @Bindable get() = field
        set(value) {
            field = value
            notifyPropertyChanged(BR.lastName)
        }
}

在布局文件中使用数据绑定

接下来,我们需要在布局文件中使用数据绑定。我们需要在根布局中添加 layout 标签,并启用数据绑定:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.app.User" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={user.firstName}" />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={user.lastName}" />

    </LinearLayout>
</layout>

在 Activity 或 Fragment 中绑定数据

最后,我们需要在 ActivityFragment 中绑定数据并设置视图模型:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.app.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        val user = User().apply {
            firstName = "John"
            lastName = "Doe"
        }
        binding.user = user
    }
}

深入理解 @Bindable 的工作原理

自动生成的 BR 类

当我们在属性上添加 @Bindable 注解时,数据绑定框架会自动生成一个 BR 类。这个类包含了所有绑定属性的 ID,用于在属性值变化时通知数据绑定框架。例如,BR.firstNameBR.lastName 就是自动生成的 ID。

object BR {
    @JvmField
    val _all = 0
    @JvmField
    val firstName = 1
    @JvmField
    val lastName = 2
}

notifyPropertyChanged 方法

notifyPropertyChanged 方法用于通知数据绑定框架某个属性的值发生了变化。我们需要在属性的 setter 方法中调用它,并传递相应的属性 ID。例如:

var firstName: String = ""
    @Bindable get() = field
    set(value) {
        field = value
        notifyPropertyChanged(BR.firstName)
    }

这样,当 firstName 的值变化时,数据绑定框架会自动更新所有绑定了 firstName 的视图。

高级用法

双向数据绑定

双向数据绑定允许我们在视图和数据模型之间实现双向同步。例如,当用户在 EditText 中输入文本时,数据模型会自动更新;同样,当数据模型的值发生变化时,视图也会自动更新。我们可以通过在 XML 中使用 @= 语法来实现双向数据绑定:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@={user.firstName}" />

自定义属性和 BindingAdapter

有时候,我们需要在视图上绑定一些自定义属性。为此,我们可以使用 BindingAdapter 注解来自定义数据绑定逻辑。例如,我们可以为 ImageView 创建一个自定义绑定适配器,用于加载网络图片:

import android.widget.ImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide

object BindingAdapters {
    @JvmStatic
    @BindingAdapter("imageUrl")
    fun loadImage(view: ImageView, url: String?) {
        if (!url.isNullOrEmpty()) {
            Glide.with(view.context).load(url).into(view)
        }
    }
}

在布局文件中使用自定义属性:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:imageUrl="@{viewModel.imageUrl}" />

性能优化

在使用数据绑定时,我们需要注意性能优化,特别是在大型项目中。以下是一些常见的优化建议:

使用 ObservableField

对于简单的单个字段绑定,可以使用 ObservableField 来代替 @Bindable 注解和 BaseObservable,这样可以减少代码量并提高性能:

import androidx.databinding.ObservableField

class User {
    val firstName = ObservableField<String>()
    val lastName = ObservableField<String>()
}

避免过度绑定

绑定的数据越多,数据绑定框架的开销就越大。尽量只绑定必要的数据,避免不必要的绑定和数据刷新。

结论

@Bindable 注解是 Android 数据绑定框架中的一个关键部分,通过它可以实现数据和视图的双向绑定,从而简化代码结构,提高代码的可维护性。通过本文的介绍,相信你已经对 @Bindable 注解的基本用法、高级用法和性能优化有了更深入的了解。在实际开发中,合理使用 @Bindable 和数据绑定框架,可以大大提升开发效率和应用的用户体验。

Best regards!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP Build 3-调用SAP BAPI和调用S4HC API

1. 调用SAP BAPI 1.1 前提 项目已创建 SAP环境登录正常 1.2 引入BAPI SDK 商店中下载BAPI SDK Process中导入BAPI SDK 1.3 新建action group 新建action group时&#xff0c;会要求填写SAP登录信息&#xff0c;根据连接类型分为SSO&#xff0c;Basic和Custom 如果选择SS…

数据恢复篇:如何在 Android 手机上恢复未保存/删除的 Word 文档

在 Android 手机上访问 Word 文档通常很简单&#xff0c;但是当这些重要文件被删除或未保存时会发生什么&#xff1f;这种情况虽然令人痛苦&#xff0c;但并非毫无希望。到 2024 年&#xff0c;有几种强大的方法来处理此类数据丢失。本指南重点介绍如何在Android手机上恢复已删…

AI时代创新潮涌,从探路到引路,萤石云引领千行百业创新

步入AI新时代&#xff0c;AI、云计算、大数据等技术迅速迭代&#xff0c;并日益融入经济社会发展各领域全过程&#xff0c;数字经济成为推动千行百业转型升级的重要驱动力量。 今年的政府工作报告提出&#xff0c;深入推进数字经济创新发展。积极推进数字产业化、产业数字化&a…

UnityUGUI之二 CameraTargetTexture

在我们需要将3D物体呈现在2D视角时就可以使用TargetTexture&#xff0c;若想只显示3D物体则需改变背景颜色&#xff0c;并且得再增加一个相机

为什么我学个 JAVA 就已经耗尽所有而有些人还能同时学习多门语言

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;我的入门语言是C&#xff0c…

Spring两大核心思想 IoC和AoP

目录 ✨ 一、什么是IoC 1、定义 &#x1f38a; 2、IoC思想 &#x1f38a; 3、优势 &#x1f38a; 4、对象的管理 &#x1f38a; 存对象&#xff1a;Component 取对象&#xff1a;AutoWired ✨二、什么是DI 1、定义 &#x1f38a; 2、IoC和DI的关系&#x1f38a; 可…

Stable Diffusion【真人模型】:人脸特美的人像摄影大模型wuhaXL_realisticMixV3.0

今天和大家分享一个基于SDXL的真人大模型&#xff1a;wuhaXL_realisticMix。该模型无需使用LORA**就能生成的特别漂亮的人脸&#xff0c;虽然有时候人脸有些假&#xff0c;但是生成的人脸确实非常漂亮。 该模型底模融合了WhiteXL_realisticMix&#xff0c;训练素材来自于视频转…

nacos开启认证之后,服务就无法注册了

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

机器学习项目-基于随机森林的航空公司用户满意度分析

摘要 ​ 航空旅行是人们出行的常用方式之一&#xff0c;乘客对于航空公司的服务质量有着较高的要求。满意度是衡量服务质量的重要指标&#xff0c;因此预测航空公司乘客的满意度对于提高服务质量具有重要意义。 ​ 近年来&#xff0c;机器学习在预测领域得到了广泛应用。机器…

08 - Python面向对象编程进阶

面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识&#xff0c;知道了如何定义类&#xff0c;如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发&#xff0c;我们还需要对Python中的面向对象编程进行更为深入的了解。 property装…

mst[讲课留档]

最小生成树(Minimum Spanning Tree) (1)概念 我们知道&#xff0c;树是有 n n n个结点&#xff0c; n − 1 n-1 n−1条边的无向无环的连通图。 一个连通图的生成树是一个极小的连通子图&#xff0c;它包含图中全部的 n n n个顶点&#xff0c;但只有构成一棵树的 n − 1 n-1 …

SAP实现特别总账的凭证预制

SAP实现特别总账的凭证预制 仔细理解只有”其他”的特殊总帐标识才可预制凭证这句话. F-29/f-48不可预制。F-29/f-48预制时出现错误消息号 FP 030&#xff0c;提示特殊总帐标志类型“汇票和”预付定金“的特别总帐标志的过帐代码不能预制&#xff0c;这是系统写死的&#xff…

骨传导耳机哪个牌子好?精选靠谱好用的TOP5骨传导耳机推荐!

在超过八成的音乐爱好者都面临听力健康问题的当下&#xff0c;骨传导耳机因其独特的听觉体验和对听力的保护&#xff0c;在音频设备市场中备受瞩目。但近期我发现不少用户在选购骨传导耳机时常常受到不专业产品的误导。身为有着5年经验的数码博主&#xff0c;在此提醒大家&…

Web基础与HTTP协议:

Web基础与HTTP协议 Web&#xff1a;就是我们所说的页面&#xff0c;打开网站所展示的页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; 分布式图形信息系统。 http https &#xff08;加密的&#xff09;超文本传输协议 分布式&#xff1a;计算机系统或者应用程序…

数据分析与挖掘案例-电子商务网站用户行为分析及服务推荐

数据分析与挖掘案例-电子商务网站用户行为分析及服务推荐 文章目录 数据分析与挖掘案例-电子商务网站用户行为分析及服务推荐1. 背景与挖掘目标2. 分析方法与过程2.1 分析步骤与流程2.2 数据抽取2.3 数据探索分析1. 分析网页类型2. 分析网页点击次数 2.4 数据预处理1. 删除不符…

《昇思25天学习打卡营第23天 | 昇思MindSporeRNN实现情感分类》

23天 本节学习了RNN实现情感分类。 循环神经网络&#xff08;RNN&#xff09;是一类以序列&#xff08;sequence&#xff09;数据为输入&#xff0c;在序列的演进方向进行递归&#xff08;recursion&#xff09;且所有节点&#xff08;循环单元&#xff09;按链式连接的神经网…

C++视觉开发 一.OpenCV环境配置

一.OpenCV安装环境配置 1.OpenCV安装 &#xff08;1&#xff09;下载 官方下载链接&#xff1a;http://opencv.org/releases 这边选择需要的版本&#xff0c;我是在windows下的4.9.0。&#xff08;科学上网下载很快&#xff0c;否则可能会有点慢&#xff09; (2)安装 双击下…

【深度学习】图生图img3img论文原理,SD EDIT

https://arxiv.org/abs/2108.01073 摘要 引导图像合成技术使普通用户能够以最小的努力创建和编辑逼真的图像。关键挑战在于平衡对用户输入&#xff08;例如&#xff0c;手绘的彩色笔画&#xff09;的忠实度和合成图像的真实感。现有的基于GAN的方法试图通过使用条件GAN或GAN反…

【CT】LeetCode手撕—93. 复原 IP 地址

目录 题目1- 思路2- 实现⭐93. 复原 IP 地址——题解思路 3- ACM 实现 题目 原题连接&#xff1a;93. 复原 IP 地址 1- 思路 模式识别&#xff1a;给一个 String 字符串 ——> 复原 IP 地址 ——> 回溯三部曲 &#xff0c;回溯的切割问题 ——> 实现一个左闭右闭区间…

小白入门云计算的最佳方式,是去考一张AWS证书

云计算的快速发展让它成为现代IT行业的核心技术之一。 作为一名初学者&#xff0c;如何高效地入门云计算&#xff1f; 我的建议是&#xff1a;考一张AWS证书。 AWS&#xff08;Amazon Web Services&#xff09;在云计算市场占据领先地位&#xff0c;它的认证体系既权威又全面&a…