Android DataBinding 基础入门

news2025/1/18 19:05:06

DataBinding 是谷歌官方发布的一个框架,顾名思义即为数据绑定,是 MVVM 模式在 Android 上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰。MVVM 相对于 MVP,其实就是将 Presenter 层替换成了 ViewModel 层。DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常

参考博客

启用 DataBinding 的方法是在对应 Model :appbuild.gradle 文件里加入以下代码,同步后就能引入对 DataBinding 的支持

android {
    dataBinding {
        enabled = true
    }
}

1、在布局文件中绑定指定的变量打开布局文件,选中布局文件的第一行,按住 Alt + 回车键,点击 “Convert to data binding layout”,就可以生成 DataBinding 需要的布局规则
在这里插入图片描述
在这里插入图片描述
和原始布局的区别在于多出了一个 layout 标签将原布局包裹了起来,data 标签用于声明要用到的变量以及变量类型,要实现 MVVM 的 ViewModel 就需要把数据(Person)与 UI(View)进行绑定,data 标签的作用就像一个桥梁搭建了 View 和 Person 之间的通道

Person类

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在 data 标签里声明要使用到的变量名、类的全路径(如果 Person类型要多处用到,也可以直接将之 import 进来,就不用每次都指明整个包名路径)

<data>
    <variable
        name="per1"
        type="com.example.databindingpro.Person" />
    <variable
        name="work"
        type="String" />
    </data>

如果存在 import 的类名相同的情况,可以使用 alias 指定别名

    <data>
        <import type="com.leavesc.databinding_demo.model.User" />
        <import
            alias="TempUser"
            type="com.leavesc.databinding_demo.model2.User" />
        <variable
            name="userInfo"
            type="User" />
        <variable
            name="tempUserInfo"
            type="TempUser" />
    </data>

这里声明了一个 Person类型的变量per1,我们要做的就是使这个变量与两个 TextView 控件挂钩,通过设置per1的变量值同时使 TextView 显示相应的文本 完整的布局代码如下所示

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
    <variable
        name="per1"
        type="com.example.databindingpro.Person" />
    <variable
        name="work"
        type="String" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{per1.name}"
                android:textSize="30dp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{String.valueOf(per1.age)}"
                android:textSize="30dp"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{work}"
                android:textSize="30dp"/>
        </LinearLayout>
    </LinearLayout>
</layout>

通过 @{per1.name}使 TextView 引用到相关的变量,DataBinding 会将之映射到相应的 getter 方法 之后可以在 Activity 中通过 DataBindingUtil 设置布局文件,省略原先 Activity 的 setContentView() 方法,并为变量per1 赋值

import androidx.databinding.DataBindingUtil;
import android.app.Activity;
import android.os.Bundle;
import com.example.databindingpro.databinding.ActivityMainBinding;
public class MainActivity extends Activity {
 private ActivityMainBinding mActivityMainBinding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        mActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        com.example.databindingpro.Person person = new com.example.databindingpro.Person("张三",23);
        mActivityMainBinding.setPer1(person);//给布局文件name="per1"传入数据,类型为Person对象
        mActivityMainBinding.setWork("Teacher");//给布局文件name="work"传入数据,类型为String字符串
    }
}

效果:
在这里插入图片描述

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

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

相关文章

github加速的方法

一、UU加速器 1、下载软件 网易UU加速器——不止快&#xff0c;还很稳 (163.com) 2、搜索学术两个字&#xff0c;点击启动游戏 二、Steam加速器 1、下载软件 Watt Toolkit - 瓦特工具箱(Steam官网) (steampp.net) 2、选择按钮之后&#xff0c;点击一键启动

聚焦磷酸铁锂产线革新,宏工科技一站式解决方案

兼顾了低成本与安全性两大属性&#xff0c;磷酸铁锂市场在全球范围内持续升温&#xff0c;并有望保持较高的景气度。巨大的需求空间之下&#xff0c;行业对于锂电装备企业的自动化与智能化水平、整线交付能力、产品效率与稳定性等均提出了新的要求。 以宏工科技股份有限公司&a…

【IOTE】物联网射频模组和芯片级方案提供商——深圳信驰达科技将精彩亮相IOTE物联网展

►►►强势来袭 Strong Attack 主物联场&#xff0c;相约深圳&#xff1b;2023&#xff0c;共论商机&#xff01;IOTE2023第二十届国际物联网展深圳站将于2023年9月20-22日在深圳国际会展中心(宝安新馆)开展&#xff01;汇聚全球超800家参展企业&#xff0c;呈现更多数字化纷呈…

恒运资本:两市迎普涨,创业板指涨超3%,汽车配件等板块走强

29日早盘&#xff0c;A股两市低开高走&#xff0c;沪指涨幅超1%&#xff0c;创业板指涨超3%。截至午间收盘&#xff0c;沪指涨1.39%报3141.82点&#xff0c;深成指涨2.41%&#xff0c;创业板指涨3.47%%&#xff0c;两市算计成交6265亿元。北向资金净流入超38亿元。盘面上&#…

基于面向对象的空间自相关指数,即插即用!Moran‘s I,局部莫兰指数,Geary‘s C指数,附完整可行使用案例

Geary’s C Geary’s C&#xff08;也称为Geary’s coefficient&#xff09;是一种用于衡量空间自相关性的统计指标&#xff0c;它可以用来评估地理数据中的空间聚集或离散程度。Geary’s指数的计算公式如下&#xff1a; G ( n − 1 ) ∗ ( Σ Σ w i j ∗ ( x i − x j ) 2…

windows下Node版本的切换方式

为了避免应用构建出错&#xff0c;我们在本地开发环境的 Node 版本与在 CI/CD 流程中指定的 Node 版本需保持一致。在这种需要频繁切换 Node 版本的情况下&#xff0c;我们不可能手动卸载又安装不同的版本&#xff0c;这时我们可以借助 NVM 工具来帮助我们快速地切换 Node 版本…

轻量、便捷、高效—经纬恒润AETP助力车载以太网测试

随着自动驾驶技术和智能座舱的不断发展&#xff0c;高宽带、高速率的数据通信对主干网提出了稳定、高效的传输要求&#xff0c;CAN(FD)、LIN已无法充分满足汽车的通信需求。车载以太网作为一种快速且扩展性好的网络技术&#xff0c;已经逐步成为了汽车主干网的首选。 此外&…

无涯教程-Android - Services

服务是在后台运行以执行长时间运行的操作而无需与用户交互的组件&#xff0c;并且即使应用程序被破坏&#xff0c;它也可以工作。服务实际上可以采取两种状态- Sr.No.State & Remark1 Started 当应用程序组件(如Activity)通过调用 startService()启动服务&#xff0c;启动后…

vue数组对象中按某一字段排序

给下列数组字段中的month排序 第一步&#xff1a;methods中写一个方法如下&#xff1a; sortBy(attr, rev) {//第二个参数没有传递 默认升序排列if(rev undefined) {rev 1;} else {rev (rev) ? 1 : -1;}return function(a, b) {a a[attr];b b[attr];if(a < b) {retu…

概念解析 | 合成孔径雷达在海洋动力学研究中的应用

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:合成孔径雷达海洋动力研究。 揭秘海洋的心跳:合成孔径雷达与海洋动力学的交响乐 海洋,那个占据地球表面三分之二的神秘世界,它的运动和变化直接影响着全球气候系统,以及…

解决maven仓库无法自动下载程序包的问题

在调试idea项目报错&#xff1a;未解析的依赖项:de.fhpotsdam:unfolding:jar:0.9.6 问题描述解决方法总结 问题描述 在调试idea项目时报如上所示错误&#xff0c;并尝试了网上所说的更改maven仓库为阿里云仓库等方法&#xff0c;但是maven均无法自动下载unfolding程序包。 解…

企业重要数据怎么加密?企业数据加密软件哪个好?

企业的数据安全至关重要&#xff0c;关系到企业的健康发展&#xff0c;我们可以采用加密的方法来保护企业数据安全。那么&#xff0c;企业重要数据该怎么加密呢&#xff1f;企业数据加密软件哪个好&#xff1f;下面我们就来了解一下。 企业数据加密要求 企业数据加密的要求往…

YOLOv5模型压缩:综述

YOLOv5模型压缩:综述 AbstractIntroduction剪枝基于ln-范数修剪模型Feature map activationBatch normalization scaling factor (BNSF)First-order derivativeMutual informationGranularity of Pruning非结构化剪枝结构化剪枝基于通道的修剪基于滤波器的修剪基于核的剪枝关于…

AutoRunner自动化测试工具新版本智能识别算法之视觉识别

泽众AutoRunner&#xff08;简称AR&#xff09;是国内专业的支持C/S、B/S各种技术框架的、基于组件识别的自动化测试工具&#xff0c;实现7*24小时的自动化回归测试和功能测试&#xff0c;让测试更智能。 视觉识别是一种通过计算机技术对图像或视频进行分析和理解的方法。这种算…

checkstyle检查Java编程样式:final参数

checkstyle可以利用FinalParameters检查方法、构造器、catch和for-each块的参数是final的&#xff1a; https://checkstyle.sourceforge.io/checks/misc/finalparameters.html 背后的原理&#xff1a;程序执行期间修改参数的值会引起混乱&#xff0c;所以应该避免。 要配置使…

一道经典面试题:@Configuration 和 @Component 有何区别?

关于 Configuration 注解有一个特别经典的面试题&#xff1a; Configuration 和 Component 有什么区别&#xff1f; 无论小伙伴们之前是否背过相关的面试题&#xff0c;今天这篇文章学完之后相信大家对这个问题都会有更深一层的理解&#xff0c;废话不多少&#xff0c;咱们开…

地理空间数据的定义、收集和应用

简介 地理空间数据是指与地球表面特定位置相关的数据。它包含多种数据类型&#xff0c;包括地图、卫星图像和GIS&#xff08;地理信息系统&#xff09;数据。近年来&#xff0c;由于技术的进步以及对有关物理世界的准确和最新信息的需求不断增长&#xff0c;地理空间数据的…

9、监测数据采集物联网应用开发步骤(7)

监测数据采集物联网应用开发步骤(6) 串口(COM)通讯开发 本章节测试使用了 Configure Virtual Serial Port Driver虚拟串口工具和本人自写的串口调试工具&#xff0c;请自行baidu下载对应工具 在com.zxy.common.Com_Para.py中添加如下内容 #RS232串口通讯列表 串口号,波特率,…

恒运资本:股票佣金怎么算?

股票佣钱是指证券买卖中券商向出资者收取的手续费。股票买卖中&#xff0c;佣钱是不可避免的一项本钱&#xff0c;出资者需求清楚地了解佣钱的收费规范和怎么核算&#xff0c;以便更好地掌握出资本钱&#xff0c;做出更正确的出资决策。 佣钱收费规范 股票佣钱收费规范&#x…

来文心中国行!专家面对面解读大模型产业实践及AI场景突围

9月1日&#xff0c;文心中国行将走进武汉。政府、高校及企业AI专家将现场分享人工智能与大模型最新政策、趋势、人才培养方案及产业实践案例&#xff0c;深入解读如何抓住大模型时代新机遇&#xff0c;高效实现智能化转型升级弯道超车。 加快实现高水平科技自立自强&#xff0c…