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

2024-05-28 15:36

本文主要是介绍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);}
}

这篇关于Jetpack架构组件_2. 数据绑定库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010968

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr