HarmonyOS 应用 · 寝室投票投票页深度解析:Radio 单选与 enabled 按钮联动
HarmonyOS 应用 · 寝室投票投票页深度解析Radio 单选与 enabled 按钮联动项目编号49-dorm-vote 技术栈HarmonyOS ArkTS · ArkUI 声明式 UI · Stage 模型 本篇页面投票页Func2Tab.ets81 行 系列导航一首页 · 二创建 ·三投票· 四结果一、Option interface 与 selected 状态interface Option { id: number; emoji: string; name: string; }三个字段id是 key 锚点emoji是选项图标name是选项名。StorageProp(safeTop) safeTop: number 0; StorageProp(safeBottom) safeBottom: number 0; State selected: number -1; private options: Option[] [ { id: 1, emoji: , name: 黄焖鸡米饭 }, { id: 2, emoji: , name: 汉堡炸鸡 }, { id: 3, emoji: , name: 披萨意面 }, { id: 4, emoji: , name: 麻辣香锅 } ];State selected: number -1——初始 -1 表示未选中任何选项。-1 是哨兵值selected 0即有选中项驱动按钮的启用/禁用。四个外卖选项黄焖鸡/汉堡炸鸡/披萨意面/麻辣香锅。二、页面骨架QuestionCard OptionList Buttonbuild() { Column() { this.Header() Scroll() { Column({ space: 16 }) { this.QuestionCard() this.OptionList() Button(this.selected 0 ? 确认投票 : 请选择一个选项).fontSize(15) .fontColor(#FFFFFF).backgroundColor(this.selected 0 ? C.primary : C.textDim) .width(100%).height(48).borderRadius(D.rMd) .enabled(this.selected 0) .onClick(() { promptAction.showToast({ message: 投票成功 }); }) } .width(100%) .padding({ left: D.pad, right: D.pad, top: 16, bottom: D.pad this.safeBottom 20 }) } .layoutWeight(1).scrollBar(BarState.Off).align(Alignment.Top) } .width(100%).height(100%).backgroundColor(C.bg) }selected驱动按钮三态——文案、底色、可点性三路分支// 文案确认投票 vs 请选择一个选项 Button(this.selected 0 ? 确认投票 : 请选择一个选项) // 底色粉色 vs 灰色 .backgroundColor(this.selected 0 ? C.primary : C.textDim) // 可点性启用 vs 禁用 .enabled(this.selected 0)enabled()是本页特色——系列首次使用组件禁用属性。未选中时按钮灰色 禁用点击无效选中后按钮变粉 启用——必须选择才能投票的强约束比 Toast 校验更前置。三、Header 与 QuestionCard问题上下文Builder Header() { Row() { Text(参与投票).fontSize(20).fontWeight(FontWeight.Bold).fontColor(C.text) } .width(100%).height(this.safeTop 56).padding({ top: this.safeTop, left: D.pad, right: D.pad }) .backgroundColor(C.card).alignItems(VerticalAlign.Bottom) } Builder QuestionCard() { Column({ space: 8 }) { Text( 今晚点什么外卖).fontSize(18).fontWeight(FontWeight.Bold).fontColor(C.text).width(100%) Text(单选 · 3/4 人已投票 · 剩余 2 小时).fontSize(12).fontColor(C.textDim).width(100%) } .width(100%).padding(16).backgroundColor(C.card).borderRadius(D.rLg).border({ width: 1, color: C.stroke }) }18 号加粗问题 12 号灰色上下文单选 · 3/4 人已投票 · 剩余 2 小时——一句话交代投票类型、进度、剩余时间。问题卡让用户先理解投什么再选择。四、OptionListRadio 单选 卡片边框联动Builder OptionList() { Column({ space: 12 }) { ForEach(this.options, (o: Option, idx: number) { Row({ space: 12 }) { Text(o.emoji).fontSize(26) Text(o.name).fontSize(15).fontColor(C.text).layoutWeight(1) Radio({ value: o.name, group: vote }) .checked(this.selected idx).radioStyle({ checkedBackgroundColor: C.primary }) .onClick(() { this.selected idx; }) } .width(100%).padding(16) .backgroundColor(this.selected idx ? C.primarySoft : C.card).borderRadius(D.rMd) .border({ width: this.selected idx ? 2 : 1, color: this.selected idx ? C.primary : C.stroke }) .onClick(() { this.selected idx; }) }, (o: Option) o.id.toString()) }.width(100%) }Radio组件——系列首次出现的单选组件Radio({ value: o.name, group: vote }) .checked(this.selected idx) .radioStyle({ checkedBackgroundColor: C.primary }) .onClick(() { this.selected idx; })group: vote同组 Radio 互斥单选语义的系统级保证checked(this.selected idx)绑定选中态radioStyle({ checkedBackgroundColor: C.primary })选中圆点粉色。卡片双态联动——selected idx驱动底色与边框// 底色浅粉 vs 白底 .backgroundColor(this.selected idx ? C.primarySoft : C.card) // 边框2px 粉色 vs 1px 浅灰 .border({ width: this.selected idx ? 2 : 1, color: this.selected idx ? C.primary : C.stroke })选中项卡片浅粉底 2px 粉色边框加粗突出未选白底 1px 浅灰边框。整卡onClick设this.selected idx——点击卡片任意位置图标/名称/Radio都能选中。五、单选状态链路selected形成三处联动点击卡片/Radio → selected idx → Radio checked 转移单选互斥 → 卡片底色/边框高亮转移 → 按钮变确认投票粉色 enabled 启用一次点击触发三处刷新——Radio 组互斥 卡片高亮 按钮启用的完整链路。enabled的存在让未选择状态在按钮层面就被拦截无需 Toast 提示。六、可演进方向方向现状改法收益投票写入Toast 模拟服务器提交 票数1真实投票多选支持仅单选multiChoice 时 Checkbox selected 数组单/多选切换倒计时静态剩余 2 小时动态倒计时 到时禁用投票限时投票后反馈Toast跳转结果页查看实时票数闭环反馈已投状态可重复投记录已投选项 按钮变已投一人一票投票页是投票的核心交互——selected驱动 Radio 互斥、卡片高亮、按钮启用的三处联动。从哨兵值 -1 的状态设计到enabled的禁用约束每一层都有明确的职责边界。系列导航一首页 · 二创建 ·三投票· 四结果

相关新闻

HarmonyOS 应用 · 寝室投票创建页深度解析:选项动态增删与不可变更新

HarmonyOS 应用 · 寝室投票创建页深度解析:选项动态增删与不可变更新

HarmonyOS 应用 寝室投票创建页深度解析:选项动态增删与不可变更新 项目编号:49-dorm-vote 技术栈:HarmonyOS ArkTS ArkUI 声明式 UI Stage 模型 本篇页面:创建页 Func1Tab.ets(114 行) 系列导航&#x…

2026/10/4 11:04:40 阅读更多 →
【Hermes Agent本地化】用本地模型守住隐私:TaoToken 统一 Key 接入实践

【Hermes Agent本地化】用本地模型守住隐私:TaoToken 统一 Key 接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 11:23:55 阅读更多 →
Gemini 3.1 Pro 大模型性能飙升,小白程序员速来围观收藏!

Gemini 3.1 Pro 大模型性能飙升,小白程序员速来围观收藏!

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 11:41:16 阅读更多 →

最新新闻

开源健身教练平台Workout.cool:训练计划与进度追踪实战解析

开源健身教练平台Workout.cool:训练计划与进度追踪实战解析

最近逛GitHub的时候翻到一个挺有意思的项目:Workout.cool,定位是“现代化开源健身教练平台”。顺手把仓库拉下来跑了一遍,又把文档和代码过了一遍,今天这篇就把这个项目掰开揉碎聊一聊——它到底解决了什么问题、训练计划和进度追…

2026/10/5 15:48:18 阅读更多 →
ADS1.2“Cannot obtain license”报错排查:从FLEXlm机制到环境变量

ADS1.2“Cannot obtain license”报错排查:从FLEXlm机制到环境变量

1. 报错背后的许可证机制:ADS1.2到底在检查什么最近帮一位朋友倒腾老实验箱,在一台Windows 11电脑上装完ADS1.2,兴冲冲打开命令行敲了一句armcc -v,结果屏幕直接弹出一行红字:Cannot obtain license for Compiler (fea…

2026/10/5 15:48:18 阅读更多 →
YOLOv5遥感目标识别:从环境复现到数据切图全流程解析

YOLOv5遥感目标识别:从环境复现到数据切图全流程解析

简介:面向遥感图像目标识别场景的YOLOv5完整项目包,涵盖卫星图像目标检测的Python程序代码、训练好的模型权重、网络结构配置及配套说明文档,适配高分项目与科研实训需求。项目代码经过验证运行稳定,适合计算机视觉相关专业学生用…

2026/10/5 15:48:18 阅读更多 →
开源免费Open-Shell:恢复Win10/11经典开始菜单与任务栏

开源免费Open-Shell:恢复Win10/11经典开始菜单与任务栏

如果你跟我一样,从Win7甚至XP一路用过来,再切到Win10、Win11,大概率会经历一段“找不准开始菜单”的暴躁期。新版开始菜单不是不好看,而是交互逻辑变了,鼠标用户尤其吃亏:磁贴挤、图标大、常用功能藏得深&a…

2026/10/5 15:48:17 阅读更多 →
Java IO流与文件操作:从原理到实战,避开常见坑

Java IO流与文件操作:从原理到实战,避开常见坑

很多人学Java时,对文件操作和IO流的感受就俩字:头疼。File类、InputStream、OutputStream、Reader、Writer……一套体系下来名词多、概念抽象,再加上编码、缓冲、异常处理这些细节,写起来总是不顺。但说实话,文件操作和…

2026/10/5 15:48:17 阅读更多 →
Python实时2D流体模拟:从Navier-Stokes到GPU加速的完整实现

Python实时2D流体模拟:从Navier-Stokes到GPU加速的完整实现

1. 这个项目到底想解决什么问题 先说结论:我这次折腾的目标,是纯粹用 Python 从零实现一个能实时交互的 2D 流体模拟器,核心基于 Navier-Stokes 方程,最终通过 GPU 加速把计算规模拉到肉眼可见的流畅帧率,整套流程覆盖…

2026/10/5 15:47:17 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →