Jetpack架构组件_2. 数据绑定库

news2024/9/24 19:24:46

1.理论基础

        数据绑定库是一个支持库,可让您使用声明性格式(而不是以程序化方式)将布局中的界面组件绑定到应用中的数据源。

        布局通常使用调用界面框架方法的代码在 activity 中定义。例如,以下代码会调用 findViewById() 来查找 TextView widget 并将其绑定到 viewModel 变量的 userName 属性:        

TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());

         以下示例展示了如何使用数据绑定库直接在布局文件中将文本分配给 widget。这样便无需调用上述任何 Java 代码。请注意在赋值表达式中使用 @{} 语法:

<TextView
    android:text="@{viewmodel.userName}" />

        这样做的好处英文原文如下:

        Binding components in the layout file lets you remove many UI framework calls in your activities, making them simpler and easier to maintain. This can also improve your app's performance and help prevent memory leaks and null pointer exceptions. 

2.代码实现步骤

step1

        app模块中的build.gradle配置databinding。

    dataBinding{
        enabled=true
    }

step2

        把XML布局文件转换为DataBinding可以识别和绑定的布局文件。

        选中根节点LinearLayout,按Alt+Enter弹出快捷菜单Convert to data binding layout。

         LinearLayout布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</LinearLayout>

         转换后布局文件:增加了<layout>包裹。

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

    <data>

    </data>

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

    </LinearLayout>
</layout>

step3

        实例化布局文件对象,xml布局转成类对象。

        activity_main对应的布局文件对象的命名采用了大驼峰命名ActivityMainBinding。使用ActivityMainBingding对象就可以操控UI控件。

step4

        在activity_main.xml布局文件声明变量

         创建User类,并在布局文件中的data标签底下声明这个User类型的变量。

public class User {
    public String userName;
    public String password;

}
    <data>
        <variable
            name="user"
            type="com.wellsun.onewaydatabinding.User" />
    </data>

step5

        在组件中使用变量

        @{变量},这样就完成了数据源和UI控件的绑定,数据源值变,UI控件的值变。

        <EditText
            android:text="@{user.userName}"
            android:layout_margin="20dp"
            android:id="@+id/edtUserName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入用户名" />

 step6

        给ActivityMainBinding赋值,默认是空值。

        方式1: 

        activityMainBinding.setUser(user); 

        方式2:  

        activityMainBinding.setVariable(BR.user,user); 

3.示例代码

        整体布局文件和Activity如下代码: 

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

    <data>
        <variable
            name="user"
            type="com.gaoting.onewaydatabinding.User" />

        <variable
            name="goods"
            type="com.gaoting.onewaydatabinding.Goods" />

        <variable
            name="Alia"
            type="String" />
    </data>

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

        <EditText
            android:text="@{user.userName}"
            android:layout_margin="20dp"
            android:id="@+id/edtUserName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入用户名" />

        <EditText
            android:text="@{user.password}"
            android:layout_margin="20dp"
            android:id="@+id/edtPassword"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="请输入密码" />
        <TextView
            android:text="@{Alia}"
            android:layout_margin="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />

        <TextView
            android:text="@{goods.goodsName}"
            android:layout_margin="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />

        <Button
            android:layout_margin="20dp"
            android:id="@+id/btChangeUser"
            android:text="改变用户名为gao,密码为123"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        </Button>

        <Button
            android:layout_margin="20dp"
            android:id="@+id/btResume"
            android:text="恢复为初始用户名和密码"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        </Button>

    </LinearLayout>
</layout>

 UI控件

         MainActivity.java

package com.gaoting.onewaydatabinding;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.databinding.DataBindingUtil;

import com.gaoting.onewaydatabinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding activityMainBinding;
    User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        //从值到UI的一个映射(单向绑定,数据员与UI控件)
        user = new User();
        user.userName = "gaoting";
        user.password="123456";
        activityMainBinding.setUser(user);

        activityMainBinding.btChangeUser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user.userName="gao";
                user.password = "123";
                activityMainBinding.setVariable(BR.user,user);
            }
        });


        activityMainBinding.btResume.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user.userName="gaoting";
                user.password = "123456";
                activityMainBinding.setUser(user);
            }
        });

        activityMainBinding.setAlia("John");
        Goods goods = new Goods();
        goods.goodsName="夹克衫";
        activityMainBinding.setGoods(goods);
    }
}

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

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

相关文章

一键秒删TXT文本符号,释放工作效率新高度,轻松应对海量文本处理挑战!

在这个信息爆炸的时代&#xff0c;我们每天都会面对海量的文本信息。而在处理这些文本时&#xff0c;你是否曾经因为各种符号的干扰而头疼不已&#xff1f;现在&#xff0c;我们为你带来了一款高效批量处理工具&#xff0c;它能够一键删除TXT文本中的符号&#xff0c;让你的工作…

面试八-存泄漏是什么,有哪几种,怎么解决?

一、内存泄漏几种情况 当使用基类指针指向派生类对象时&#xff0c;如果基类的析构函数不是虚函数&#xff0c;那么在使用基类指针来删除这个对象时&#xff0c;只会调用基类的析构函数&#xff0c;而不会调用派生类的析构函数。这就导致了派生类中的资源无法正确释放&#xff…

前端使用JavaScript实现一个LRU缓存

引言 LRU&#xff08;Least Recently Used&#xff09;算法是一种广泛应用于内存管理和缓存系统的策略&#xff0c;在微前端、状态管理以及性能优化等场景下&#xff0c;合理使用缓存机制能够有效提升应用性能。本文将介绍LRU算法的基本原理&#xff0c;并通过JavaScript实现案…

MySQL(进阶)--索引

目录 一.存储引擎 1.MySQL体系结构​编辑 2.存储引擎简介 3.存储引擎特点 (1.InnoDB (2.MyISAM (3.Memory 4.存储引擎选择 二.索引 1.索引概述 2.索引结构 3.索引分类 4.索引语法 (1.创建索引 (2.查看索引 (3.删除索引 5.SQL性能分析 (1.SQL执行频率 (2.慢查…

Linux——Dockerfile部分参数(1)

在这里我们来整理一下docker容器、dockerfile、docker镜像的关系&#xff1a; dockerfile是面向开发的&#xff0c;发布项目做镜像的时候就要编写dockerfile文件。 dockerfile&#xff1a;构建文件&#xff0c;定义了一切的步骤&#xff0c;源代码。 dockerImanges&#xff1a…

为什么Facebook Marketplace无法使用?如何解决?

Facebook Marketplace是一个允许用户买卖商品的平台&#xff0c;由于其在Facebook内的便捷性&#xff0c;它逐渐成为了一个受欢迎的在线交易市场。然而&#xff0c;做Facebook跨境电商&#xff0c;很多人会面临的情况就是无法使用Facebook Marketplace。这到底是什么原因&#…

PSexec工具横向移动

一. 其他横向工具和命令介绍 之前我们讲解了IPC,PTH,PTK,PTH&#xff0c;其实这些东西都是用来进行认证的 IPC:使用明文的账号密码进行认证 PTH:使用NTLM-hash值进行认证 PTK:使用AES秘钥进行认证 PTT:使用票据进行认证认证通过之后如何实现远程上线内网其他的机器&#xff0…

23种设计模式全面总结 | 快速复习(附PDF+MD版本)

本篇文章是对于23种设计模式的一个全面的总结&#xff0c;受限于文章篇幅无法对每个设计模式做到全面的解析&#xff0c;但几乎每个设计模式都提供了案例和类图结构&#xff0c;非常适合快速复习和在学习设计模式之前的全预习把握。 &#x1f4a1;文章的 pdf markdown 版本可通…

智能座舱-车载声学技术训练营

语音交互赋能车载智能终端&#xff0c;成为智能座舱生态构建的核心功能 曾几何时&#xff0c;至少十年前&#xff0c;车内语音交互&#xff0c;大家都认为是“智障”阶段&#xff0c;基本上除了难用作为评价找不到其他的形容词做修饰。 但是随着技术的不断发展&#xff0c;特别…

2024年哪款充电宝好?热门罗马仕、西圣、倍思充电宝全方面实测

在这个人人都离不开手机的时代&#xff0c;出门坐车需要用到手机刷卡&#xff0c;吃饭点外卖需要用到手机&#xff0c;做旅游攻略需要用到手机等等&#xff0c;如果是出门一天的话不带充电宝&#xff0c;手机基本是不能够撑回到家的&#xff0c;这时候就需要一个充电宝辅助我们…

整理前端新出的操作工具好用又好玩(Custom Formatter,Oxlint,Nuxt DevTools,component-party)

1.使用Custom Formatter 使vue3中的reactive object 在Chrome在console中更易理解的方式展现 启用步骤&#xff1a; 1.打开控制台&#xff0c;然后打开console设置 2.前往proferences中的Console&#xff0c;勾选Enable custom formatters选项 3.刷新页面 2.使用css Overv…

【NumPy】权威指南:使用NumPy的percentile函数进行百分位数计算

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

2024最新(PC+WEB+IOS+Android)即时通讯系统客户端仿默往IM源码下载

2024最新(PCWEBIOSAndroid)即时通讯系统客户端仿默往IM源码下载(总大小约2.4G&#xff09; 系统功能配置灵活、海量并发、稳定可靠、数据安全&#xff0c;2小时快速部署、数据安全、单聊群聊、系统通知等通信功能&#xff0c;支持App、PC、Web等多端快速接入。 群功能&#xf…

【小米手环7】表盘修改/制作指南

2024年了还有人用小米手环7么&#xff1f; 5月10号得到我的小米手环7nfc&#xff0c;随之开启了我对表盘制作的探索之旅。~历时18天&#xff0c;终于让我成功修改了官方表盘——荧光电子&#xff01;表盘&#xff1a;羽球人的荧光电子已上传至表盘自定义工具app。 接下来&…

将x减到0的最小操作(滑动窗口)

算法原理&#xff1a; 第一眼看到这个题的时候&#xff0c;我真的想不到它到底是怎么和滑动窗口联系起来的&#xff0c;在我的脑海里只有一个简单的双指针。直到我看过了题解&#xff0c;才明白原来是这么回事&#xff1a;先看题目是求最小操作数&#xff0c;此时你一定不要先…

二叉树顺序结构实现【堆的实现】【详细图解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、二叉树的顺序结构2、堆的概念3、堆的实现3.1 堆实现的前提3.1.1 向上调整3.1.2 向下调…

网络安全行为可控定义以及表现内容简述

在数字化快速发展的今天&#xff0c;网络安全已成为国家和企业不可或缺的防线。据统计&#xff0c;网络攻击事件频发&#xff0c;给全球经济带来了巨大损失。因此&#xff0c;确保网络安全行为可控显得尤为重要。今天我们来聊聊网络安全行为可控定义以及表现内容。 网络安全行为…

音视频开发9 FFmpeg 解复用框架说明,重要API说明

一&#xff0c;播放器框架 二 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a; 即特定格式的多媒体文件&#xff0c; 比如mp4、flv、mkv等。 媒体流&#xff08;Stream&#xff09;&#xff1a; 表示时间轴上的一段连续数据&#xff0…

维护课堂纪律的重要性

在课堂上&#xff0c;老师们是否经常遇到这样的情况&#xff1a;孩子们交头接耳&#xff0c;小动作不断&#xff0c;甚至有人偷偷玩手机&#xff1f;这些行为长让老师感到头疼&#xff0c;但作为老师&#xff0c;是否思考过&#xff0c;维护课堂纪律的重要性究竟何在&#xff1…

生信网络学院|05月31日《SOLIDWORKS Manage 产品周期管理》

课程主题&#xff1a;SOLIDWORKS Manage 产品周期管理 课程时间&#xff1a;2024年05月31日 14:00-14:30 主讲人&#xff1a;付舰 生信科技 PLM实施顾问 1、SOLIDWORKS Manage介绍 2、周期流程管理 3、产品项目管理 4、项目会议管理 5、项目问题管理 安装腾讯会议客户端…