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

相关文章

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构