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

Android-Kotlin基础(Jetpack②-Data Binding)

功能需求
显示用户的姓名、年龄、身份(学生 / 上班族)
点击按钮切换用户信息

一、传统方式实现

1. 布局文件(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/tvName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"/><TextViewandroid:id="@+id/tvAge"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"/><TextViewandroid:id="@+id/tvIdentity"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"/><Buttonandroid:id="@+id/btnChange"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="切换用户"android:layout_marginTop="16dp"/></LinearLayout>
2. Activity 代码(MainActivity.kt)
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextViewclass MainActivity : AppCompatActivity() {// 声明所有需要操作的控件private lateinit var tvName: TextViewprivate lateinit var tvAge: TextViewprivate lateinit var tvIdentity: TextViewprivate lateinit var btnChange: Button// 数据private var currentUser = User("张三", 20, true)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 1. 手动绑定所有控件(最繁琐的步骤)initViews()// 2. 手动更新UIupdateUI()// 3. 手动设置点击事件btnChange.setOnClickListener {// 切换数据currentUser = if (currentUser.name == "张三") {User("李四", 25, false)} else {User("张三", 20, true)}// 手动更新UIupdateUI()}}// 初始化所有控件(findViewById重复劳动)private fun initViews() {tvName = findViewById(R.id.tvName)tvAge = findViewById(R.id.tvAge)tvIdentity = findViewById(R.id.tvIdentity)btnChange = findViewById(R.id.btnChange)}// 手动更新所有控件内容private fun updateUI() {tvName.text = currentUser.nametvAge.text = "年龄:${currentUser.age}"tvIdentity.text = if (currentUser.isStudent) "学生" else "上班族"}// 数据类data class User(val name: String,val age: Int,val isStudent: Boolean)
}

二、Data Binding 方式实现

1. 布局文件(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="user"type="com.example.databindingdemo.MainActivity.User" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><!-- 直接绑定数据,无需id --><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}"  <!-- 数据绑定 -->android:textSize="18sp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{`年龄:` + user.age}"  <!-- 表达式拼接 -->android:layout_marginTop="8dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.isStudent ? `学生` : `上班族`}"  <!-- 条件判断 -->android:layout_marginTop="8dp"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="切换用户"android:layout_marginTop="16dp"android:onClick="@{() -> user.change()}"  <!-- 绑定点击事件 -->android:enabled="@{user.name.isNotEmpty()}"/>  <!-- 动态控制启用状态 --></LinearLayout>
</layout>
2. Activity 代码(MainActivity.kt)
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.databindingdemo.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {// 只需要声明Binding对象private lateinit var binding: ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 初始化Binding(替代setContentView和findViewById)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)// 绑定数据(自动更新UI)binding.user = User("张三", 20, true)}// 数据类(包含修改逻辑)inner class User(val name: String,val age: Int,val isStudent: Boolean) {// 点击事件处理fun change() {// 直接修改绑定的数据,UI自动更新binding.user = if (name == "张三") {User("李四", 25, false)} else {User("张三", 20, true)}}}
}

三、核心差异对比

对比维度传统方式Data Binding 方式
控件获取需手动写大量 findViewById自动生成 Binding 类,直接通过属性访问
UI 更新需手动调用 setText() 等方法数据变化后自动更新 UI
代码量多(初始化、更新逻辑重复)少(省略模板代码)
可读性数据与 UI 关联分散在代码中数据与 UI 关联集中在布局中
维护成本高(修改 UI 需同时改代码)低(布局与数据绑定一目了然)
错误检查运行时可能因控件 ID 错误崩溃编译时检查绑定表达式,提前发现错误
事件处理需手动设置 setOnClickListener布局中直接绑定事件,逻辑更集中

Data Binding 方式的区别

当使用 Data Binding 时,布局文件会被自动处理成一个 Binding 类(比如 activity_main.xml 会生成 ActivityMainBinding 类),这个类相当于布局文件的 "代码代表"。

第一行:binding = ActivityMainBinding.inflate(layoutInflater)
  • ActivityMainBinding:自动生成的类,名字是布局文件名(下划线转驼峰)+ Binding
  • inflate(layoutInflater):这是解析布局的过程,相当于传统的 "把 XML 变成 View"
  • 执行后,binding 对象就持有了整个布局的所有控件和数据绑定能力
第二行:setContentView(binding.root)
  • binding.root:指的是布局文件的根节点(比如你布局中的 LinearLayout 或 ConstraintLayout
  • 这行代码的作用和传统 setContentView(R.layout.xxx) 一样:让 Activity 显示这个根节点对应的界面
  • 区别是:传统方式直接传布局 ID,Data Binding 方式传已经解析好的根 View

形象比喻

可以把布局文件想象成 "设计图纸":

  • 传统方式:直接告诉 Activity "用图纸 ID 302 建房子"(setContentView(R.layout.xxx)),之后需要自己去房子里找各个房间(findViewById)。
  • Data Binding 方式:先请一个 "施工队"(ActivityMainBinding.inflate())根据图纸建好房子,得到一个 "房屋管理手册"(binding),手册里记录了所有房间的位置。然后告诉 Activity "就用这个建好的房子"(setContentView(binding.root)),之后想找哪个房间,直接查手册就行(binding.tvName)。

http://www.lryc.cn/news/613179.html

相关文章:

  • 内存杀手机器:TensorFlow Lite + Spring Boot移动端模型服务深度优化方案
  • Bosco-and-Mancuso Filter for CFA Image Denoising
  • python函数--python010
  • Java NIO 核心原理与秋招高频面试题解析
  • MySQL 极简安装挑战:跨平台高效部署指南
  • 大数据中需要知道的监控页面端口号都有哪些
  • 【unity知识】unity使用AABB(轴对齐包围盒)和OBB(定向包围盒)优化碰撞检测
  • 单词的划分(动态规划)
  • OpenCV 图像处理基础操作指南(一)
  • 非化学冷却塔水处理解决方案:绿色工业时代的革新引擎
  • Android视图状态以及重绘
  • 如何将服务器中的Docker镜像批量导出?
  • uat是什么
  • SIP - Centos 7 搭建freeswitch服务器
  • Linux第一阶段练习
  • Microsoft Office PowerPoint 制作简单的游戏素材
  • Sklearn 机器学习 数据降维PCA 自己实现PCA降维算法
  • 智能升级革命:Deepoc具身模型开发板如何让传统除草机器人拥有“认知大脑”
  • 【智能协同云图库】第六期:基于 百度API 和 Jsoup 爬虫实现以图搜图
  • RabbitMQ面试精讲 Day 15:RabbitMQ故障转移与数据恢复
  • 【数据结构】排序(sort) -- 交换排序(冒泡快排)
  • 大数据杀熟:技术阴影下的消费陷阱与破局之道
  • Dokcer创建中间件环境
  • RabbitMQ面试精讲 Day 13:HAProxy与负载均衡配置
  • 【Day 18】Linux-DNS解析
  • 香港网站服务器被占用的资源怎么释放?
  • 股指期货合约是个啥?怎么玩?
  • JVM 终止机制详解:用户线程与守护线程
  • WD6208资料和引脚图
  • MCU中的晶振(Crystal Oscillator)