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

Android Jetpack Compose - Compose 重组、AlertDialog、LazyColumn、Column 与 Row

一、Compose 重组

1、基本介绍
  1. 重组是 Compose 更新的唯一方式,当状态变化时,Compose 会重新执行受影响的 Composable 函数,生成新的 UI 描述

  2. MutableState<T>是一个可观察的状态容器,它持有一个值,当这个值改变时,会通知所有订阅它的 Composable 函数进行重组

  3. remember 是一个 Composable 函数,用于在 Composable 函数重组时记住一个值

2、演示
(1)演示 1
@ComposablefunCounterDemo(){varcountbyremember{mutableStateOf(0)}println("CounterDemo 重组,count:$count")Button(onClick={count++}){Text("点击了$count次")}}
  1. 启动应用,输出结果如下
CounterDemo 重组,count: 0
  1. 点击按钮,按钮文本发生变化,输出结果如下
CounterDemo 重组,count: 1
(2)演示 2
varnum=10@ComposablefunCounterDemo2(){println("CounterDemo2 重组,num:$num")Column{Button(onClick={num++}){Text("点击了$num次")}Button(onClick={println("[查看] 点击了$num次")}){Text("查看 num")}}}
  1. 启动应用,输出结果如下
CounterDemo2 重组,num: 10
  1. 点击第一个按钮,按钮文本未发生变化,无输出结果

  2. 点击第二个按钮,输出结果如下

[查看] 点击了 12 次
(3)演示 3
valcount:MutableState<Int>=mutableStateOf(10)@ComposablefunCounterDemo3(){println("CounterDemo3 重组,num:${count.value}")Column{Button(onClick={count.value++}){Text("点击了${count.value}次")}Button(onClick={println("[查看] 点击了${count.value}次")}){Text("查看 count")}}}
  1. 启动应用,输出结果如下
CounterDemo3 重组,num: 10
  1. 点击第一个按钮,按钮文本发生变化,输出结果如下
CounterDemo3 重组,num: 11
  1. 点击第二个按钮,输出结果如下
[查看] 点击了 11 次

二、AlertDialog

varshowDialogbyremember{mutableStateOf(false)}Button(onClick={showDialog=true}){Text("显示对话框")}if(showDialog){AlertDialog(onDismissRequest={showDialog=false},title={Text("确认删除")},text={Text("确定要删除这条记录吗?")},confirmButton={Button(onClick={showDialog=false}){Text("确定")}},dismissButton={Button(onClick={showDialog=false}){Text("取消")}})}

三、LazyColumn

1、基本介绍

LazyColumn 是 Compose 中用于显示垂直滚动列表的组件,它只渲染当前屏幕可见的列表项,适用于大量数据列表的显示

2、演示
  1. LazyColumn 的基本使用
valitems=listOf("Item 1","Item 2","Item 3","Item 4","Item 5")LazyColumn{items(items.size){index->Text(text=items[index],modifier=Modifier.padding(16.dp),fontSize=18.sp)}}
valdataList=listOf("苹果","香蕉","橙子","葡萄")LazyColumn{itemsIndexed(dataList){index,item->Text(text="第${index+1}项:$item",modifier=Modifier.padding(16.dp),fontSize=18.sp)}}
  1. 动态数据的 LazyColumn
valdataList=remember{mutableStateListOf("苹果","香蕉","橙子","葡萄")}Column{LazyColumn{itemsIndexed(dataList){index,item->Text(text="第${index+1}项:$item",modifier=Modifier.padding(16.dp),fontSize=18.sp)}}Button(onClick={dataList.add("西瓜")}){Text(text="添加",fontSize=18.sp)}}
vardataListbyremember{mutableStateOf(listOf("苹果","香蕉","橙子","葡萄"))}Column{LazyColumn{itemsIndexed(dataList){index,item->Text(text="第${index+1}项:$item",modifier=Modifier.padding(16.dp),fontSize=18.sp)}}Button(onClick={dataList=dataList+"西瓜"}){Text(text="添加",fontSize=18.sp)}}
  1. LazyColumn 的点击事件
valdataList=remember{mutableStateListOf("苹果","香蕉","橙子","葡萄")}LazyColumn{itemsIndexed(dataList){index,item->Text(text="第${index+1}项:$item",modifier=Modifier.padding(16.dp).clickable{dataList.remove(item)},fontSize=18.sp)}}
  1. 带有列表头部的列表
valdataList=remember{mutableStateListOf("苹果","香蕉","橙子","葡萄")}LazyColumn{item{Text(text="列表头部",modifier=Modifier.padding(16.dp),fontSize=20.sp,fontWeight=FontWeight.Bold)Divider()}itemsIndexed(dataList){index,item->Text(text="第${index+1}项:$item",modifier=Modifier.padding(16.dp).clickable{dataList.remove(item)},fontSize=18.sp)}}

四、Column 与 Row

1、基本介绍
  • Column 和 Row 是 Compose 中用于线性排列子组件的核心布局容器,本质上是 Android 传统布局中 LinearLayout 的替代
  1. Column 用于垂直方向排列子组件,即从上到下

  2. Row 用于水平方向排列子组件,即从左到右

2、演示
  1. Column 的基本使用
Column(modifier=Modifier.background(Color.LightGray).padding(16.dp)){Text(text="第一个垂直子组件",modifier=Modifier.padding(4.dp))Text(text="第二个垂直子组件",modifier=Modifier.padding(4.dp))Text(text="第三个垂直子组件",modifier=Modifier.padding(4.dp))}
  1. Row 的基本使用
Row(modifier=Modifier.background(Color.LightGray).padding(16.dp)){Text(text="第一个水平子组件",modifier=Modifier.padding(4.dp))Text(text="第二个水平子组件",modifier=Modifier.padding(4.dp))Text(text="第三个水平子组件",modifier=Modifier.padding(4.dp))}
http://www.jsqmd.com/news/206224/

相关文章:

  • 深入 ‘Token Consumption Profiling’:在大规模图中精准定位哪一个‘思维步骤’最费钱?
  • 基于SpringBoot的农产品溯源系统
  • 从零开始学CTF:网络安全竞赛完全指南,建议收藏学习
  • 2025 网安工程师证怎么考?11 月考试 + 8 月报名,新考点(Prompt 注入 / SM4 算法)拆解!
  • 2026年焦虑是无法避免的
  • 从2025到2026:SUNX 合约交易所是如何一步步赢得用户信任的
  • 什么是 ‘Latency Budgeting’:为图中每一个节点设置纳秒级的超时阈值,实现强制故障转移
  • 为什么游戏需要“加载时间“?——从硬盘读取到内存渲染
  • 【Mybatis 框架】SQL 注入判断技巧全解,零基础入门到精通,收藏这篇就够了!
  • 数字员工赋能AI销冠系统与AI提效软件系统提升企业运营效率
  • Unity PicoVR开发 实时预览Unity场景 - 在Pico设备中
  • 2025生产管理系统排名:黑湖、用友、鼎捷,谁更适合中小企业?
  • 无人机高分辨率街景语义分割数据集 深度学习框架unet模型如何训练无人机这个无人机航拍街景语义分割数据集
  • 车间手机管理难题破解指南:从“一刀切禁止”到“数字化疏导”的科学决策
  • 网络进阶教程:节点小宝中心节点策略的反向使用方法!
  • 基于springboot的民间救援队救助系统设计与实现
  • 基于PFC离散元颗粒流模拟霍普金森杆(SHPB)压缩岩石/混凝土
  • 告别“SQL翻译器”:飞算JavaAI如何让开发者实现数据库查询的真正智能化
  • 解析 LangSmith 的 ‘Nested Trace’:如何通过深度树状视图定位 20 层嵌套循环中的逻辑瓶颈?
  • 基于JAVA的图书馆图书资源检索借阅系统应用和研究
  • 从免费到专业:飞算JavaAI如何定义企业级智能开发新标准
  • Jenkins RCE漏洞CVE-2024-23897:从任意文件读取到远程代码执行
  • 【MVCD 6】
  • 系统安装及使用
  • 探索AI智能体VertGrow的独特功能与核心优势
  • 高效协作:工程团队与LLM共建可维护代码的标准化流程
  • RAG与知识图谱结合:技术选型的关键考量
  • 必看收藏!有手就行!50分钟教会你用LoRA微调打造专业会议语音助手
  • [精品]基于微信小程序的瑜伽体验课预约系统 UniApp
  • 【珍藏】Deep Thinking RAG:让AI具备思考能力,解决传统RAG五大痛点,附完整代码