Jetpack入门:DataBinding

news2024/10/5 16:28:46

目录

一、DataBinding简介

设置 Data Binding

数据绑定表达式

双向绑定

二、例子

例1:DataBinding实现文本绑定和点击事件

 MainActivity :

CountStart :

Food: 

 OnClickListener :

 activity_main:

 build.gradle:

运行结果:

例2:二级界面的绑定

  activity_main:

sub_main: 

三、总结

一、DataBinding简介

        DataBinding 是一种用于在安卓应用中实现简洁、高效的数据绑定的库。它使开发者能够以声明性的方式将 UI 组件与数据源进行绑定,从而自动更新界面上的数据,并简化了与 UI 相关的代码编写过程。

设置 Data Binding

要使用 Data Binding,需要进行以下设置:

  1. 在 app 模块的 build.gradle 文件中启用 Data Binding:

android {
    ...
    dataBinding {
        enabled = true
    }
}

    2. 在布局文件顶部添加 <layout> 标签来包裹布局内容:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 布局内容 -->
</layout>

3.在 Activity 或 Fragment 中获取绑定的实例:

// 在 Activity 中通过 setContentView 方法绑定布局
MyLayoutBinding binding = DataBindingUtil.setContentView(this, R.layout.my_layout);

// 在 Fragment 中通过 LayoutInflater 绑定布局
MyLayoutBinding binding = MyLayoutBinding.inflate(inflater, container, false);

数据绑定表达式

可以在布局文件中使用表达式语言来引用绑定的数据和执行操作,例如:

  • 引用变量或对象属性:

<TextView
    android:text="@{user.name}"
    ... />
  • 执行方法调用:
<Button
    android:onClick="@{onClickListener.onButtonClick()}"
    ... />
  • 使用条件语句和循环:
<TextView
    android:text="@{user.isAdult ? `Adult` : `Child`}"
    ... />

<LinearLayout
    android:visibility="@{user.isAdmin ? View.VISIBLE : View.GONE}"
    ... />

<RecyclerView
    app:itemList="@{list}"
    ... />

双向绑定

DataBinding 还支持双向绑定,即将 UI 组件的变化反映到数据源中。可以通过 @= 符号实现双向绑定:

<EditText
    android:text="@={user.name}"
    ... />

二、例子

例1:DataBinding实现文本绑定和点击事件

 MainActivity :

package com.example.databinding2;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;


import android.os.Bundle;

import com.example.databinding2.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding mainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        // 利用DataBinding绑定UI文本
        Food food = new Food("麻辣烫", (float) 4);
        // 利用DataBinding实现点击事件
        mainBinding.setOnClickListener(new OnClickListener(this));
        mainBinding.setFood(food);
    }
}

CountStart :

package com.example.databinding2;

public class CountStart {
    public static String getStar(float star){
        return star +"星";
    }
}

Food: 

package com.example.databinding;

public class Food {
    public String name;
    public float star;
    public Food(String name,float star){
        this.name = name;
        this.star = star;
    }
}

 OnClickListener :

package com.example.databinding2;

import android.content.Context;
import android.view.View;
import android.widget.Toast;

public class OnClickListener {
    private Context mContext;
    public OnClickListener(Context context){
        mContext = context;
    }
    public void buttonOnClick(View view){
        Toast.makeText(mContext, "点击了提交!", Toast.LENGTH_SHORT).show();
    }

}

 activity_main:

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

    <data>
        <!-- 实现设置文本       -->
        <import type = "com.example.databinding2.CountStart"/>
        <variable
            name="Food"
            type="com.example.databinding2.Food" />
        <!-- 实现点击事件       -->
        <variable
            name="OnClickListener"
            type="com.example.databinding2.OnClickListener" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="365dp" />

        <ImageView
            android:src="@drawable/img"
            android:id="@+id/imageView"
            android:layout_width="300dp"
            android:layout_height="300dp"
            app:layout_constraintBottom_toTopOf="@+id/guideline2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.497"
            tools:srcCompat="@tools:sample/avatars" />

        <RatingBar
            android:id="@+id/ratingBar"
            android:layout_width="244dp"
            android:layout_height="54dp"
            android:max="5"
            android:rating="@{Food.star}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline2"
            app:layout_constraintVertical_bias="0.079" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="129dp"
            android:layout_height="28dp"
            android:text="@{Food.name}"
            android:textSize="20sp"
            app:layout_constraintBottom_toTopOf="@+id/ratingBar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.673"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.917" />

        <Button
            android:onClick="@{OnClickListener.buttonOnClick}"
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="160dp"
            android:text="提交"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{CountStart.getStar(Food.star)}"
            android:textSize="25sp"
            app:layout_constraintBottom_toTopOf="@+id/button"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/ratingBar" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 build.gradle:


android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.databinding"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        dataBinding {
            enabled = true
        }
    }

运行结果:

例二:二级界面的绑定

  activity_main:

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

    <data>
        <!-- 实现设置文本       -->
        <import type = "com.example.databinding2.CountStart"/>
        <variable
            name="Food"
            type="com.example.databinding2.Food" />
        <!-- 实现点击事件       -->
        <variable
            name="OnClickListener"
            type="com.example.databinding2.OnClickListener" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="365dp" />

        <ImageView
            android:src="@drawable/img"
            android:id="@+id/imageView"
            android:layout_width="300dp"
            android:layout_height="300dp"
            app:layout_constraintBottom_toTopOf="@+id/guideline2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.497"
            tools:srcCompat="@tools:sample/avatars" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="129dp"
            android:layout_height="28dp"
            android:text="@{Food.name}"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.673"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <include
            app:Food="@{Food}"
            app:OnClickListener="@{OnClickListener}"
            layout="@layout/sub_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.497"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline2"
            app:layout_constraintVertical_bias="0.253" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

sub_main: 

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="Food"
            type="com.example.databinding2.Food" />
        <!-- 实现点击事件       -->
        <variable
            name="OnClickListener"
            type="com.example.databinding2.OnClickListener" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RatingBar
            android:id="@+id/ratingBar2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:rating="@{Food.star}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.438"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.065" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="32dp"
            android:text="@{Food.name}"
            android:textSize="25sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.449"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/ratingBar2" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="提交"
            android:onClick="@{OnClickListener.buttonOnClick}"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.463"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView3" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 其他代码和运行效果跟例一一样。

三、总结

        使用 DataBinding 的主要意义在于简化安卓应用中的数据绑定和 UI 更新过程,提高开发效率和代码可读性。以下是使用 DataBinding 的一些重要意义:

1. 简化代码结构:通过 DataBinding,可以将布局文件和数据源直接绑定,从而减少了编写繁琐的 findViewById() 和手动设置数据的代码。这样可以使代码更加简洁、清晰,并且减少了因为手动更新 UI 导致的错误。

2. 减少空指针异常:DataBinding 使用空安全的表达式语言,可以避免由于数据为空而导致的空指针异常。通过在表达式中处理 null 值,可以确保安全地访问和操作数据。

3. 提高性能:Data Binding 可以实现数据与界面的实时绑定,只有当数据发生变化时才会触发 UI 的更新,相比传统的手动更新方式,能够有效地降低不必要的 UI 刷新,提高应用的性能和响应速度。

4. 支持双向绑定:DataBinding 支持双向绑定,即可以将用户对 UI 的修改反映到数据源中。这样可以轻松地实现表单输入、状态切换等功能,无需额外的回调或监听器。

5. 增强代码可读性:使用 DataBinding,可以将 UI 相关的代码和业务逻辑分离,使代码结构更加清晰,提高了代码的可读性和维护性。开发者可以专注于处理数据和逻辑层面,而不需要直接操作界面元素。

        总之,使用 DataBinding 可以简化数据绑定过程、提高性能和代码可读性,减少错误,并提供了更灵活的数据绑定和双向绑定功能。它是一种强大的工具,可以提升安卓应用的开发效率和用户体验。

未完待续。。。。。。

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

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

相关文章

用vscode远程连接Linux服务器后,如何创建自己的账号

1. 打开终端&#xff08;Terminal&#xff09;窗口 2. 在终端中创建新的用户账号 &#xff08;假设您要创建的用户名为 “newuser”&#xff09;&#xff0c;在命令执行期间&#xff0c;需要提供新用户的密码。按照提示进行操作。 先输入登录的管理员账号密码。 再输入创建的…

2.2 Entry Text输入,文本框

2.2 Entry & Text输入&#xff0c;文本框 窗口主体框架 每一个tkinter应用的主体框架都包含以下几部分&#xff1a; 主窗口: window&#xff0c;及主窗口的一些基本属性&#xff08;标题、大小&#xff09;让窗口活起来&#xff1a;window.mainloop() import tkinter as…

热插拔-udev机制

一、什么是udev&#xff1f; udev是一种设备管理工具&#xff0c;以“守护进程”的形式运行&#xff0c;通过侦听内核发出来的uevent来管理/dev目录下的设备文件。它能够根据系统中的硬件设备的状态动态更新设备文件&#xff0c;包括设备文件的创建&#xff0c;删除等。使用ud…

线程池学习(二)execute() 和 submit() 的区别

转载&#xff1a;线程池 线程提交的两种方式 ExecutorService poll3 Executors.newCachedThreadPool();for (int i 0; i < 2; i) {poll3.execute(new TargetTask());poll3.submit(new TargetTask());}execute方法 void execute(Runnable command): Executor接口中的方法s…

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Dubbo框架保姆级教学[手把手教会你]

文章目录 Dubbo框架Dubbo(RPC)概括Dubbo支持的协议Dubbo支持的注册中心dubbo的调用结构 配置服务项目- 依赖- application-local.yml配置类注解- provider(服务提供者): 远程调用的被调用的服务实例- consumer(服务消费者): 远程调用的调用发起的服务实例 远程调用原理 Dubbo负…

34.Vue自定义指令-对象式

33.Vue自定义指令&#xff08;函数式&#xff09;_vue自定义函数_未来音律的博客-CSDN博客还有一种就是&#xff0c;我们去定义指令的时候&#xff0c;也不要去写v-前缀&#xff0c;定义指令的时候需要给指令起名字&#xff0c;那么这个指令的名字直接就叫big,而用的时候还是要…

基于linux下的高并发服务器开发(第二章)- 2.7 进程退出、孤儿进程、僵尸进程

01 / 进程退出 exit.c /*#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);status参数&#xff1a;是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。 */ #include <stdio.h> #include <stdlib.…

青翼科技自主研发4路AD子卡FMC137

FMC137是一款基于VITA57.4标准规范的JESD204B接口FMC子卡模块&#xff0c;该模块可以实现4路14-bit、2GSPS/2.6GSPS/3GSPS ADC采集功能。该板卡ADC器件采用ADI公司的AD9208芯片&#xff0c;&#xff0c;与ADI公司的AD9689可以实现PIN脚兼容。该ADC与FPGA的主机接口通过16通道的…

word文档删除顽固的双横线

1. 选中双横线 2. 开始 - 字体 - 隐藏(勾选) 3. 顽固的双横线已成功删除

微信小程序用户登录及头像昵称设置教程(前后端)

目录 1.背景分析 2.具体需求分析 3.前端设计 3.1 用户登录 3.2 头像昵称填写&#xff08;个人信息界面&#xff09; 4.后端设计 4.1项目架构分析 4.2 代码分析 实体类 dao层 service层 controller层 工具类 5.nginx部署 6.效果演示 1.背景分析 众所周知&#x…

【Distributed】分布式Ceph存储系统之相关应用

文章目录 一、创建 CephFS 文件系统 MDS 接口1. 服务端操作1.1 在管理节点创建 mds 服务1.2 查看各个节点的 mds 服务1.3 创建存储池&#xff0c;启用 ceph 文件系统1.4 查看mds状态1.5 创建用户 2. 客户端操作2.1 客户端要在 public 网络内2.2 在客户端创建工作目录2.3 在 cep…

相册搜索功能再升级?iOS17隐藏小细节曝光,关键字搜索视频声音

据博主Ryan McLeod的最新推文透露&#xff0c;iOS 17已经隐藏了一些小细节&#xff0c;其中包括相册搜索功能的改进。用户现在可以通过在iOS 17的相册中输入关键字来快速查找含有特定声音的视频片段&#xff0c;从而提供更便捷的用户体验。例如&#xff0c;输入动物叫声的关键字…

朴素贝叶斯与贝叶斯网络详解

文章目录 一、背景1.1 贝叶斯方法的提出1.2 频率派与贝叶斯派的区别 二、分类问题三、基础知识3.1 条件概率3.2 联合概率3.3 贝叶斯公式4.1 贝叶斯网络介绍4.2 贝叶斯网络的基本结构4.2.1 head-to-head&#xff08;共同作用&#xff09;4.2.2 tail-to-tail&#xff08;共同原因…

【北大是如何考DFS的】【我们一起60天准备考研算法面试(大全)-第十六天 16/60】【DFS】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

马斯克宣布成立xAI——引领开放人工智能时代的新纪元

马斯克宣布成立xAI——引领开放人工智能时代的新纪元 &#x1f7e2;一、前言&#x1f7e2;二、马斯克的背景与愿景&#x1f7e2;三、xAI的潜在研究方向&#x1f7e2;四、xAI面临的挑战&#x1f7e2;五、xAI的潜在影响&#x1f7e2;六、xAI与OpenAI的异同&#x1f7e2;七、对Ope…

人脸识别轻量版

github地址 https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB 下载后测试 前提是安装了pytorch环境&#xff0c;原始测试py文件是这个&#xff0c;是需要用命令行执行的 为了测试方便&#xff0c;我将它改成容易debug的 """ This c…

键入网址发生什么--基础网络知识

浏览器解析URL生成请求信息&#xff0c;发送给web服务器。 一、浏览器解析URL & 浏览器解析URL作用&#xff1a;确定了 Web 服务器和文件名 URL组成&#xff1a;http&#xff1a; // web服务器域名 /目录名/ / 目录名/ ....文件名 当没有具体文件路径名时&#xff…

SRT对比TCP协议的优缺点

主流的流媒体协议&#xff0c;如HTTP&#xff0c;HLS&#xff0c;RTMP是TCP协议&#xff0c;而RTSP既可以基于TCP也可基于UDP协议进行数据传输。 从趋势来看&#xff0c;新的流媒体协议大都选择UDP作为底层传输协议&#xff0c;其主要原因和流媒体业务本身的特性及TCP特性有关。…

[相遇 Bug] - ImportError: numpy.core.multiarray failed to import

背景: 因为最近在看点云模型, 在自己的环境上部署该项目: https://github.com/open-mmlab/OpenPCDet/tree/master 执行命令: 这里执行github项目给的demo.py文件, 命令格式如下: python demo.py --cfg_file cfgs/kitti_models/pointpillar.yaml --ckpt xxx/pointpillar_772…