Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用

一、build.gradle引入对应的依赖

在build.gradle(app模块)里引入依赖,然后Sync Now一下:

 android {
 ​
     viewBinding {
         enabled = true
     }
     dataBinding {
         enabled = true
     }
 }

image-20250111160833915

完整的build.gradle代码如下所示:

 
plugins {
     id 'com.android.application'
     id 'org.jetbrains.kotlin.android'
 }
 apply plugin: 'kotlin-kapt'
 ​
 android {
     compileSdk 33
 ​
     defaultConfig {
         applicationId "com.check.databindingproject"
         minSdk 23
         targetSdk 33
         versionCode 1
         versionName "1.0"
 ​
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
 ​
     viewBinding {
         enabled = true
     }
     dataBinding {
         enabled = true
     }
 ​
 ​
 ​
     buildTypes {
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
     kotlinOptions {
         jvmTarget = '1.8'
     }
 }
 ​
 dependencies {
 ​
     implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1" // ViewModel 和 LiveData
     implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1"  // LiveData
     implementation "androidx.activity:activity-ktx:1.7.0"  // 添加 ViewModel KTX 扩展
     implementation 'androidx.appcompat:appcompat:1.3.0'
     implementation 'com.google.android.material:material:1.4.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
 }
 configurations.all {
     resolutionStrategy {
         force "org.jetbrains.kotlin:kotlin-stdlib:1.8.10"
         force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10"
     }
 }

二、转换视图成data binding layout

2、找到想要改为dataBinding视图的页面, Mac系统的按Option Enter (Windows系统的按Alt + Enter)弹出如下:

比如选中的是activity_main.xml视图文件,那么

image-20250111161225024

 
<?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout 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"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">
 ​
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Hello World!"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 ​
 </androidx.constraintlayout.widget.ConstraintLayout>

选择这个功能之后,就可以将当前xml文件转换成

 <?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>
 ​
     </data>
 ​
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:context=".MainActivity">
 ​
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Hello World!"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 ​
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

整体变成了下面这种布局方式

 <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>
     
     </data>
     
     <!--  布局文件之前的样式  -->
     ...
     
 </layout>    

可以看到页面出现了新的Layout和data的空标签。(data 就是用来存放数据的)

改造之后的完整的代码如下所示:

 
<?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 ​
     <data>
         <variable
             name="user"
             type="com.check.databindingproject.UserModel" />
     </data>
 ​
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:context=".MainActivity">
 ​
         <TextView
             android:id="@+id/name_text"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             app:layout_constraintTop_toTopOf="parent"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintRight_toRightOf="parent"
             tools:text="姓名"
             android:text="@{`Name is ` + user.name}"  />
 ​
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             app:layout_constraintTop_toBottomOf="@id/name_text"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintRight_toRightOf="parent"
             tools:text="年龄"
             android:text="@{`Age is ` + user.age}" />
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

其中正常绑定某个变量的值到控件的某个元素上,可以用@{user.age},括号里面用变量替代。然后如果想在里面加上一些常量值,那么就用模板@{`Age is` + user.age}

三、创建ViewModel和Binding对象

3、创建ViewModel类

UserModel.kt

 
package com.check.databindingproject
 ​
 import androidx.databinding.BaseObservable
 import androidx.databinding.Bindable
 ​
 class UserModel(user_name: String, user_age: Int) : BaseObservable() {
 ​
     @get:Bindable
     var name: String = user_name
         set(value) {
             field = value
             notifyPropertyChanged(BR.name) // 触发绑定更新
         }
 ​
     @get:Bindable
     var age: String = user_age.toString()
         set(value) {
             field = value
             notifyPropertyChanged(BR.age) // 触发绑定更新
         }
 }

MainViewModel.kt

 
package com.check.databindingproject
 ​
 import androidx.lifecycle.ViewModel
 ​
 class MainViewModel : ViewModel() {
     val user = UserModel("Alice", 300)
 }

接下来到对应的Activity里,声明全局变量为视图去掉下划线改大写+binding, 比如视图为activity_main.xml,则对应声明的databinding类型变量就是ActivityMainBinding类型,如下:

MainActivity.kt

 package com.check.databindingproject
 ​
 import android.os.Bundle
 import androidx.appcompat.app.AppCompatActivity
 import androidx.databinding.DataBindingUtil
 import androidx.lifecycle.ViewModelProvider
 import com.check.databindingproject.databinding.ActivityMainBinding
 ​
 class MainActivity : AppCompatActivity() {
 ​
     private lateinit var binding: ActivityMainBinding
     private lateinit var viewModel: MainViewModel
 ​
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 ​
         // 获取 ViewModel
         viewModel = ViewModelProvider(this)[MainViewModel::class.java]
 ​
         // 使用 DataBinding
         binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
         // 将 ViewModel 的 user 绑定到布局
         binding.user = viewModel.user 
 ​
         // 如果你需要动态更改数据,可以直接修改 UserModel 的属性
         viewModel.user.name = "Bob"
         viewModel.user.age = "1300"
     }
 }

最后显示出来的效果就是

image-20250112110902372

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握Golang strings包:高效字符串处理指南

掌握Golang strings包&#xff1a;高效字符串处理指南 引言为什么要学习和掌握strings包本教程的目标 基本用法strings包概述导入strings包常用函数列表及简要介绍 字符串创建与基本操作创建字符串字符串连接&#xff1a;Join重复字符串&#xff1a;Repeat修改字符串&#xff1…

论文阅读:Searching for Fast Demosaicking Algorithms

今天介绍一篇有关去马赛克的工作&#xff0c;去马赛克是 ISP 流程里面非常重要的一个模块&#xff0c;可以说是将多姿多彩的大千世界进行色彩还原的重要一步。这篇工作探索的是如何从各种各样的去马赛克算法中&#xff0c;选择最佳的一种。 Abstract 本文提出了一种方法&…

自建RustDesk服务器

RustDesk服务端 下面的截图是我本地的一个服务器做为演示用&#xff0c;你自行的搭建服务需要该服务器有固定的ip地址 1、通过宝塔面板快速安装 2、点击【安装】后会有一个配置信息&#xff0c;默认即可 3、点击【确认】后会自动安装等待安装完成 4、安装完成后点击【打开…

JavaSE学习心得(反射篇)

反射 前言 获取class对象的三种方式 利用反射获取构造方法 利用反射获取成员变量 利用反射获取成员方法 练习 保存信息 跟配置文件结合动态创建 前言 接上期文章&#xff1a;JavaSE学习心得&#xff08;多线程与网络编程篇&#xff09; 教程链接&#xff1a;黑马…

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…

信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高

《港湾商业观察》施子夫 1月8日&#xff0c;深交所官网显示&#xff0c;浙江信凯科技集团股份有限公司&#xff08;以下简称“信凯科技”&#xff09;主板IPO提交注册。 自2022年递交上市申请&#xff0c;信凯科技的IPO之路已走过两年光景&#xff0c;尽管提交注册&#xff0…

1.15学习

web ctfhub-网站源码 打开环境&#xff0c;查看源代码无任何作用&#xff0c;但是其提醒就在表面暗示我们用dirsearch进行目录扫描&#xff0c;登录kali的root端&#xff0c;利用终端输入dirsearch -u 网址的命令扫描该网址目录&#xff0c;扫描成功后获得信息&#xff0c;在…

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)

本文介绍在Windows电脑中&#xff0c;下载、部署NVM&#xff08;node.js version management&#xff09;环境&#xff0c;并基于其安装不同版本的Node.js的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法&#xff08;https://blog.csdn.net/zhebushibiaoshi…

Android Studio历史版本包加载不出来,怎么办?

为什么需要下载历史版本呢&#xff1f; 虽然官网推荐使用最新版本&#xff0c;但是最新版本如果自己碰到问题&#xff0c;根本找不到答案&#xff0c;所以博主这里推荐使用历史版本&#xff01;&#xff01;&#xff01; Android Studio历史版本包加载不出来&#xff1f; 下…

一招解决word嵌入图片显示不全问题

大家在word中插入图片的时候有没有遇到过这个问题&#xff0c;明明已经将图片的格式选为“嵌入式”了&#xff0c;但是图片仍然无法完全显示&#xff0c;这个时候直接拖动图片可能会使文字也乱掉&#xff0c;很难精准定位位置。 这个问题是由于行距设置导致的&#xff0c;行距…

C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14

目录 一.安装SQLServer 二.在SQLServer中创建一个数据库 1.打开SQL Server Manager Studio(SSMS)连接服务器 2.创建新的数据库 3.创建表 三.Visual Studio 配置 1.创建一个简单的VS项目(本文创建为一个简单的控制台项目) 2.添加数据库连接 四.简单连通代码示例 简单连…

CentOS 7 下 MySQL 5.7 的详细安装与配置

1、安装准备 下载mysql5.7的安装包 https://dev.mysql.com/get/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 下载后上传至/home目录下 2、mysql5.7安装 2.1、更新yum并安装依赖 yum update -y sudo yum install -y wget sudo yum install libaio sudo yum install perl su…

HunyuanVideo 文生视频模型实践

HunyuanVideo 文生视频模型实践 flyfish 运行 HunyuanVideo 模型使用文本生成视频的推荐配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值显存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本项目适用于使用 N…

TY1801 反激变换器PWM GaN功率开关

TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801 内置 GaN 功率管,它具备超宽 的 VCC 工作范围&#xff0c;非常适用于 PD 快充等要求宽输出电压的应用场合,系统不需要使用额外的绕组或外围降压电路&#xff0c;节省系统 BOM 成本。TY1801 支持 Burst&…

Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比

先说结论&#xff1a; Swgger 3.0 与Swagger 2.0 区别很大&#xff0c;Swagger3.0用了最新的注释实现更强大的功能&#xff0c;同时使得代码更优雅。 就个人而言&#xff0c;如果新项目推荐使用Swgger 3.0&#xff0c;对于工具而言新的一定比旧的好&#xff1b;对接于旧项目原…

【算法】图解两个链表相交的一系列问题

问&#xff1a; 给定两个可能有环也可能无环的单链表&#xff0c;头节点head1和head2。请实现一个函数&#xff0c;如果两个链表相交&#xff0c;请返回相交的第一个节点&#xff1b;如果不相交&#xff0c;返回null。如果两个链表长度之和为N&#xff0c;时间复杂度请达到O(N…

2025开年解读:AI面试 VS 传统面试本质上区别有哪些?

2024年&#xff0c;AI面试以其高效、便捷的特点逐渐走入大众视野&#xff0c;成为越来越多企业的首选。2025年开年&#xff0c;AI面试再次出现爆发式增长趋势&#xff0c;那么&#xff0c;相较于传统的面对面面试&#xff0c;AI面试究竟有哪些本质上的区别呢&#xff1f;这不仅…

springboot web基础分层解耦三层架构IOC详解 DI详解 依赖注入

三层架构 分层解耦 解除了耦合 IOC DI入门 IOC详解 组件扫描 DI详解 一般用第一种&#xff0c;规范性高用第二种 第三种一般不用 注意事项

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (五、电影详情页的设计实现)

在上一篇文章中&#xff0c;完成了电影列表页的开发。接下来&#xff0c;将进入电影详情页的设计实现阶段。这个页面将展示电影的详细信息&#xff0c;包括电影海报、评分、简介以及相关影人等。将使用 HarmonyOS 提供的常用组件&#xff0c;并结合第三方库 nutpi/axios 来实现…

交叉编译avahi到aarch64平台

谢绝转载 一、背景 准备学习无中心网络组网&#xff0c;研究如何实现无中心网络IP分配 二、环境搭建过程 找到的有参考价值的网页&#xff1a; https://zhuanlan.zhihu.com/p/60892150322 gcc_7.5.sh #! /bin/shexport PATH/home/ws/chain_tools/gcc-linaro-7.5.0-2019.1…