当前位置: 首页 > news >正文

Android架构组件:MVVM模式的实战应用于数据绑定技巧

Android架构组件中的 MVVM(Model-View-ViewModel)模式是实现 UI 和业务逻辑分离的有效方式。通过数据绑定(Data Binding),你可以更简洁地更新 UI,减少样板代码。下面是 MVVM 模式在 Android 中的实战应用以及一些数据绑定的技巧。

1. MVVM架构简介

  • Model:负责数据的获取和处理,通常与数据库或网络进行交互。
  • View:用户界面,展示数据并接收用户输入。
  • ViewModel:连接 Model 和 View,负责处理 UI 逻辑并准备数据供 View 使用。

2. Android数据绑定库

Android 数据绑定库允许你将 UI 组件与应用的数据源绑定在一起。通过数据绑定,你可以减少在 Activity 或 Fragment 中的代码量。

3. 创建 MVVM 项目

以下是一个基本的 MVVM 项目的结构和实现步骤:

  1. 添加依赖
    build.gradle 文件中添加数据绑定和其他必要的依赖:
android {...buildFeatures {dataBinding true}
}dependencies {implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0"implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"// 其他依赖
}
  1. 创建 Model
    创建一个简单的 Model 类,例如 User:
data class User(val name: String, val age: Int)
  1. 创建 ViewModel
    创建一个 UserViewModel 类,继承自 ViewModel,并使用 LiveData 来持有数据。
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModelclass UserViewModel : ViewModel() {private val _user = MutableLiveData<User>()val user: LiveData<User> get() = _userfun setUser(name: String, age: Int) {_user.value = User(name, age)}
}
  1. 创建布局文件
    在布局文件中使用数据绑定。创建一个 activity_main.xml 文件:
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="viewModel"type="com.example.app.UserViewModel" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{viewModel.user.name}" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{String.valueOf(viewModel.user.age)}" /><EditTextandroid:id="@+id/nameInput"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="Enter name" /><EditTextandroid:id="@+id/ageInput"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="Enter age" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Submit"android:onClick="@{() -> viewModel.setUser(nameInput.text.toString(), Integer.parseInt(ageInput.text.toString()))}" /></LinearLayout>
</layout>
  1. 在 Activity 中绑定 ViewModel
    MainActivity 中进行数据绑定和 ViewModel 的初始化:
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.app.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingprivate val viewModel: UserViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = DataBindingUtil.setContentView(this, R.layout.activity_main)binding.viewModel = viewModelbinding.lifecycleOwner = this// 观察用户数据变化viewModel.user.observe(this) { user ->// 这里可以处理用户数据变化,例如更新 UI}}
}

4. 数据绑定技巧

  • 双向数据绑定:可以在布局中使用 @={} 语法实现双向绑定。例如,对于输入框,可以直接绑定到 ViewModel 的属性,这样在输入框中输入的值会自动更新到 ViewModel 中。
<EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={viewModel.user.name}" />
  • 格式化数据:可以使用格式化函数来处理数据,例如将数字格式化为字符串。
android:text="@{String.valueOf(viewModel.user.age)}"
  • 自定义 Binding Adapter:如果需要对某个属性进行特殊处理,可以创建自定义的 Binding Adapter。
@BindingAdapter("app:customText")
fun setCustomText(view: TextView, text: String?) {view.text = "Custom: $text"
}

5. 总结

使用 MVVM 结合数据绑定能够显著提升 Android 应用的可维护性和可读性。通过将 UI 逻辑与数据处理分开,你可以更容易地进行单元测试和代码重用。数据绑定的技巧也能帮助你减少样板代码,提升开发效率。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringCloud-02 Consul服务注册与发现
  • OPenCV结构分析与形状描述符(2)计算轮廓周长的函数arcLength()的使用
  • 黑马点评2——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装
  • 搜维尔科技:使用Geomagic Touch X 对机械臂进行远程遥操作
  • 22. c语言怎么打印2进制、8进制、10进制、16进制数?
  • 基于Python的机器学习系列(25):使用PyTorch处理数据集
  • Unity版本升级2022 Gradle 升级7.x版本调整
  • JVM面试(五)垃圾回收机制和算法
  • opencv之阈值处理
  • 7种常见排序
  • 基于Spring的规则引擎EasyRule应用
  • jupyter 笔记本中如何判定bash块是否执行完毕
  • 【人工智能】Transformers之Pipeline(十四):问答(question-answering)
  • 【linux002】目录操作命令篇 - ls 命令
  • BF算法Java
  • 0基础学习移动端适配
  • JavaScript 基本功--面试宝典
  • jquery ajax学习笔记
  • Lucene解析 - 基本概念
  • Median of Two Sorted Arrays
  • PhantomJS 安装
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • win10下安装mysql5.7
  • 如何选择开源的机器学习框架?
  • 深入 Nginx 之配置篇
  • 双管齐下,VMware的容器新战略
  • 移动端 h5开发相关内容总结(三)
  • 优化 Vue 项目编译文件大小
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #162 (Div. 2)
  • (7)摄像机和云台
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (六)激光线扫描-三维重建
  • (强烈推荐)移动端音视频从零到上手(上)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Oracle存储过程编写经验和优化措施
  • (转)visual stdio 书签功能介绍
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .net core 6 redis操作类
  • .NET Framework杂记
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net 执行Linux下多行shell命令方法
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护