news 2026/5/19 4:01:21

第二章:Compose入门—声明式UI编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第二章:Compose入门—声明式UI编程

第二章:Compose 入门 — 声明式 UI 编程

Compose 的核心理念:用 Kotlin 代码声明 UI,而不是用 XML 布局文件。


2.1 传统 View 系统 vs Compose

对比项传统 View 系统Jetpack Compose
UI 描述XML 布局文件Kotlin 代码
状态更新findViewById + 手动修改状态驱动自动重组
组件创建继承 ViewGroup调用 Composable 函数
预览XML 预览编辑器@Preview Composable
声明方式指令式声明式

传统方式:

<!-- activity_main.xml --><LinearLayout><TextViewandroid:id="@+id/tv_title"/><Buttonandroid:id="@+id/btn_submit"/></LinearLayout>
// MainActivity.kttv_title.text="Hello"btn_submit.setOnClickListener{...}

Compose 方式:

@ComposablefunGreetingPage(){vartextbyremember{mutableStateOf("Hello")}Column{Text(text=text)Button(onClick={text="World"}){Text("Click me")}}}

2.2 Composable 函数

Compose 的 UI 构建块是@Composable函数,简称 Composable。

@ComposablefunArticleItem(title:String,description:String?,onClick:()->Unit){Card(modifier=Modifier.fillMaxWidth().padding(12.dp).clickable(onClick=onClick),){Column{ArticleImage(imageUrl=thumbnail.orEmpty())Text(text=title,fontWeight=FontWeight.Bold)Text(text=description?:"暂无描述")}}}

要点:

  • 函数标记@Composable,告诉编译器这是 UI 构建函数
  • Composable 函数可以嵌套调用,形成 UI 树
  • 所有 UI 状态通过参数传入或内部 state 管理

2.3 Modifier 修饰符

Modifier 用于配置 Composable 的布局、样式、交互:

Text(text="Hello",modifier=Modifier.fillMaxWidth()// 宽度撑满.padding(16.dp)// 内边距.clickable(onClick={}),// 可点击fontWeight=FontWeight.Bold,color=MaterialTheme.colorScheme.primary,)

常用 Modifier:

Modifier作用
fillMaxWidth()宽度撑满父布局
padding(16.dp)设置内边距
.clickable { }添加点击事件
Modifier.size(48.dp)固定尺寸
.clip(CircleShape)裁剪形状

2.4 状态管理

Compose 是响应式的,当状态变化时 UI 自动重组。

@ComposablefunSearchBar(){varsearchTextbyremember{mutableStateOf("")}OutlinedTextField(value=searchText,onValueChange={searchText=it},// 状态更新 → UI 重组label={Text("搜索内容")},)}

关键函数:

  • mutableStateOf(initial)— 创建可观察状态
  • remember { }— 在重组时保持状态不丢失
  • collectAsState()— 将 StateFlow 转为 Compose 状态

2.5 Material3 组件

项目使用 Material3 设计语言:

Scaffold(topBar={TopAppBar(title={Text("Compose 入门项目")},actions={IconButton(onClick={/* 跳转个人中心 */}){Icon(Icons.Default.Person,contentDescription="个人中心")}})}){padding->// 页面内容,padding 是顶部栏的高度Box(modifier=Modifier.padding(padding)){// ...}}

常用 Material3 组件:

  • Scaffold— 页面脚手架,提供 TopAppBar/BottomBar 等
  • Card— 卡片容器
  • Button/TextButton— 按钮
  • OutlinedTextField— 输入框
  • LazyColumn/LazyRow— 高性能列表(替代 RecyclerView)
  • CircularProgressIndicator— 加载中指示器

2.6 列表渲染:LazyColumn

传统 RecyclerView 替代方案:

LazyColumn{items(items=articles,key={it.id},// 高效重组的关键){item->ArticleItem(title=item.title,description=item.description,onClick={onArticleClick(item)})}}

优势:

  • 无需 Adapter/ViewHolder
  • key 参数确保高效更新
  • 支持itemsIndexed获取索引

2.7 预览功能

Android Studio 支持 @Preview 实时预览:

@Preview(showBackground=true,name="文章条目")@ComposablefunArticleItemPreview(){MyFirstComposeTheme{Surface(modifier=Modifier.fillMaxSize()){ArticleItem(title="Jetpack Compose 入门",description="学习声明式 UI 编程",thumbnail=null,onClick={},)}}}

预览文件通常命名为XxxPagePreview.kt,与页面分开存放。


2.8 总结

  • Compose 用 Kotlin 代码声明 UI,无需 XML
  • 状态变化自动触发 UI 重组
  • Modifier 配置组件属性,链式调用
  • LazyColumn 替代 RecyclerView,更简洁
  • @Preview 支持实时预览加速开发

上一章:第一章:项目概述与环境搭建 下一章:第三章:MVVM 架构与 ViewModel

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/19 4:00:11

火箭飞船发射航天摄影素材 航天科普多元创作需求

天舟货运飞船发射航天主题摄影素材推荐 做航天科普、新闻报道、科技教育类内容创作的朋友&#xff0c;刚好有个实用资源可以分享给你。这次整理出来的天舟系列货运飞船发射高清摄影素材包&#xff0c;覆盖了不少核心航天场景&#xff0c;画质够好&#xff0c;适配的使用场景…

作者头像 李华
网站建设 2026/5/19 3:49:41

手把手教你学Simulink——电动汽车电驱系统能量回收(再生制动)四象限运行仿真

目录 手把手教你学Simulink——电动汽车电驱系统能量回收(再生制动)四象限运行仿真 一、背景与挑战 1.1 为什么“回收”不是简单的“反转电流”? 1.2 核心痛点与设计目标 二、系统架构与核心控制推导 2.1 整体架构:从“驾驶意图”到“双向能量流” 2.2 核心数学推导:…

作者头像 李华
网站建设 2026/5/19 3:47:02

深度强化学习在卫星姿态控制中的应用与挑战

1. 项目概述&#xff1a;当深度强化学习遇见卫星姿态控制 卫星姿态控制一直是航天工程中的核心挑战。想象一下&#xff0c;一个重达数百公斤的卫星在太空中需要以0.01弧度&#xff08;约0.57度&#xff09;的精度对准某个目标——可能是地球观测相机需要对准某片区域&#xff0…

作者头像 李华
网站建设 2026/5/19 3:45:03

Godot游戏开发:基于gd-YAFSM框架的有限状态机实践指南

1. 项目概述&#xff1a;一个面向游戏开发的有限状态机框架如果你是一名游戏开发者&#xff0c;或者正在涉足需要复杂状态管理的软件项目&#xff0c;那么“状态机”这个概念你一定不陌生。简单来说&#xff0c;状态机就是用来管理一个对象&#xff08;比如游戏里的角色、UI界面…

作者头像 李华