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

1.理论基础

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

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

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

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

<TextViewandroid: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><LinearLayoutandroid: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><variablename="user"type="com.wellsun.onewaydatabinding.User" /></data>

step5

        在组件中使用变量

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

        <EditTextandroid: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><variablename="user"type="com.gaoting.onewaydatabinding.User" /><variablename="goods"type="com.gaoting.onewaydatabinding.Goods" /><variablename="Alia"type="String" /></data><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><EditTextandroid:text="@{user.userName}"android:layout_margin="20dp"android:id="@+id/edtUserName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="请输入用户名" /><EditTextandroid:text="@{user.password}"android:layout_margin="20dp"android:id="@+id/edtPassword"android:layout_width="wrap_content"android:layout_height="wrap_content"android:hint="请输入密码" /><TextViewandroid:text="@{Alia}"android:layout_margin="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:text="@{goods.goodsName}"android:layout_margin="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:layout_margin="20dp"android:id="@+id/btChangeUser"android:text="改变用户名为gao,密码为123"android:layout_width="wrap_content"android:layout_height="wrap_content"></Button><Buttonandroid: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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {user.userName="gao";user.password = "123";activityMainBinding.setVariable(BR.user,user);}});activityMainBinding.btResume.setOnClickListener(new View.OnClickListener() {@Overridepublic 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.mzph.cn/diannao/17622.shtml

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

相关文章

zabbix自定义监控项

文章目录 1、配置conf文件(zabbix_agent2)linuxwindows 2、配置监控项3、配置触发器4、查看监控数据 示例自定义程序 hash_tool&#xff1a;输出指定目录的哈希值 调用指令&#xff1a; hash_tool --path [指定目录] 1、配置conf文件(zabbix_agent2) linux vim /etc/zabbix/z…

Mac vscode 常用相关快捷键

Command 点击 多光标插入 Shift 点击 复制选中的代码块 Command X 剪切&#xff08;未选中文本的情况下&#xff0c;剪切光标所在行&#xff09; Command C 复制&#xff08;未选中文本的情况下&#xff0c;复制光标所在行&#xff09; Command V 粘贴 Command L 选中当前…

【chisel】chisel中for (i <- 0 until N-2) {} 的用法,表示什么?

在 Chisel 中&#xff0c;for (i <- 0 until N-2) {} 是一个 for 循环的语法&#xff0c;它表示从 0 开始到 N-2 的整数&#xff08;不包括 N-2&#xff09;&#xff0c;并对每个整数 i 执行大括号 {} 内的代码块。 这里的 until 是 Scala 语言的一个关键字&#xff0c;用于…

安卓获取内部存储信息

目录 前言获取存储容量 前言 原生系统设置里的存储容量到底是怎么计算的&#xff0c;跟踪源码&#xff0c;涉及到VolumeInfo、StorageManagerVolumeProvider、PrivateStorageInfo、StorageStatsManager......等等&#xff0c;java上层没有办法使用简单的api获取到吗&#xff1f…

穿越无人机中涉及到的算法主要包括以下几种:

当涉及穿越无人机中的算法时&#xff0c;我们可以从以下几个方面进行详细分析&#xff0c;并尽量参考文章中的相关数字和信息&#xff1a; 1.捷联式惯性导航系统&#xff1a; 定义&#xff1a; 利用加速度计和陀螺仪等惯性元件&#xff0c;直接测量飞行器的角运动信息和线运动…

深入解析Python中的两种导入方法:from...import与import

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、from...import与import的基本区别 1. 导入方式的不同 2. 命名空间的差异 三…

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的&#xff0c;学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS&#xff0c;是软件的一部分&#xff0c;它是硬件基础上的第一层软件&#xff0c;是硬件和其它软件沟通的桥梁。 操作系统…

软件项目管理 - 作业集合

软件项目管理 - 作业集合 作业一 1、项目与日常运作的主要区别有哪些&#xff1f; 项目&#xff1a;为提供一项独特产品、服务或成果所做的临时性努力 运作&#xff1a;连续不断周而复始的活动 项目是一次性的&#xff0c;日常运作是重复进行的&#xff1b; 项目是以目标为导…

CI/CD:持续集成/持续部署

1. 安装docker、docker-compose # 安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i sdownload.docker.commirrors.aliyun.com/docker-ce /…

neo4j docker安装使用,py2neo python包使用

参考&#xff1a;https://neo4j.com/docs/operations-manual/current/docker/introduction/ 运行&#xff1a; docker run --publish7474:7474 --publish7687:7687 neo4j查看&#xff1a; http://192***ip:7474 username/password 都是 neo4j/neo4j 简单案例 创建例子&am…

前端数据存储之cookie、LocalStorage与SessionStorage

JS详解Cookie、LocalStorage与SessionStorage 基本概念 Cookie Cookie是小甜饼的意思。顾名思义&#xff0c;cookie确实非常小&#xff0c;它的大小限制为4KB左右。他的主要用途又保存登录信息&#xff0c;比如你登录某个网站市场可以看到“记住密码”&#xff0c;这通常就是…

重生之 SpringBoot3 入门保姆级学习(04、 包扫描)

重生之 SpringBoot3 入门保姆级学习&#xff08;04、 包扫描&#xff09; 2.1 包扫描 2.1 包扫描 默认包扫描规则&#xff1a; SpringBootApplication 标注的就是主程序 SpringBoot 只会扫描主程序下面的包 自动的 component-scan 功能 在 SpringBootApplication 添加参数可以…

前端开发工程师——AngularJS

一.表达式和语句 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

【C语言】char,short char,long char分别是多少字节,多少位,多少bit

一&#xff0c;char&#xff0c;short char&#xff0c;long char分别是多少字节 在 C 语言中&#xff0c;char、short、int、long 这些数据类型的大小是平台相关的&#xff0c;它们的大小取决于编译器和操作系统的实现。然而&#xff0c;它们的大小通常遵循以下规则&#xff…

创新融合,5G+工业操作系统引领未来工厂

为加速企业完成生产制造自动化和经营管理自动化&#xff0c;从而走向未来工厂&#xff0c;蓝卓不断探索supOS工业操作系统与前沿技术的的创新融合&#xff0c;而5G技术为工业操作系统提供了更多元化的赋能手段和想象空间。目前&#xff0c;supOS围绕生产、安全、质检、监控等领…

语音转文字软件哪个好?掌握这3个方法,告别手写记录

开会多又杂&#xff0c;手写记录累死人&#xff1f; 每天的工作日程中&#xff0c;会议总是不可或缺的一部分。不论是团队讨论还是项目汇报&#xff0c;会议记录都是必不可少的。但手写记录会议内容不仅耗时耗力&#xff0c;还容易遗漏重要信息。 那么&#xff0c;有没有更高…

张驰咨询:六西格玛培训,IT界的“福尔摩斯”

六西格玛&#xff0c;这个曾以制造业为背景的管理理念&#xff0c;如今却在IT领域大放异彩。其背后的原因&#xff0c;不仅仅是因为六西格玛追求零缺陷、持续改进的核心价值观与IT行业对产品质量和用户体验的极致追求不谋而合&#xff0c;更是因为它提供了一种全新的思维方式和…

2024.05.28|生信早报【AI测试版】

日期&#xff1a;2024-05-28 拓尔思&#xff1a;拓知全球基因专利数据库助力合成生物研发&#xff0c;规避专利申请风险。和元生物&#xff1a;连续亏损&#xff0c;累计亏损1.7亿元&#xff0c;基因治疗CRO业务推出新服务。国际生物多样性日&#xff1a;杭州打造“北纬30度生…

【pyTorch安装版本真麻烦】

1、pytorch 2.0.1版本可以用cuda11.7 # CUDA 11.7 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia 2、pytorch 2.1 版本后最低cuda11.8 3、安装pytorch时候&#xff0c;注意torchaudio 版本 总之注意pyTorch安装版本…

C语言作为计算机行业的基础之一,是否制约了行业本身的发展?

c不是计算机行业的基础啦&#xff0c;你想&#xff0c;c语言出现时已经有一套成熟的计算机体系&#xff0c;有基于内存地址的寻找指令、数据的工作方式&#xff0c;有汇编语言&#xff0c;那搞出c这种高级语言就很正常啊&#xff01;刚好我有一些资料&#xff0c;是我根据网友给…