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

HarmonyOS ArkUI 弹窗系统:Toast、Dialog、ActionSheet 完全指南

文章目录

    • 前言
    • 一、Toast:轻量级消息提示
      • 1.1 基础用法
      • 1.2 本项目中的 Toast
      • 1.3 Toast 完整配置
      • 1.4 封装一个通用 Toast 工具
    • 二、AlertDialog:确认对话框
      • 2.1 单按钮对话框
      • 2.2 双按钮(确认/取消)
      • 2.3 通过 PromptAction 的 showDialog
    • 三、自定义 Dialog(CustomDialog)
      • 3.1 定义自定义弹窗
    • 四、ActionSheet:底部操作菜单
    • 五、弹窗类型选择指南
    • 总结

前言

用户完成操作后,需要及时的反馈——保存成功、网络错误、删除确认……这些交互场景都需要弹窗组件。本项目在GasStationPage.ets中就使用了getPromptAction().showToast()来提示"敬请期待"。

本篇覆盖 HarmonyOS ArkUI 的所有弹窗类型,从最简单的 Toast 到复杂的自定义 Dialog,带你掌握交互反馈的全套方案。

一、Toast:轻量级消息提示

1.1 基础用法

// 方式1:通过 UIContext 获取 PromptAction(推荐)this.getUIContext().getPromptAction().showToast({message:'操作成功!',duration:2000,// 显示时长(毫秒),默认1500ms,范围1500~10000ms});// 方式2:通过 promptAction 模块(需要 import)import{promptAction}from'@kit.ArkUI';promptAction.showToast({message:'Hello Toast!'});

1.2 本项目中的 Toast

// GasStationPage.ets.onClick(()=>{if(gasStation){this.openOrCloseMap(true);this.moveToGasStation(gasStation.latitude,gasStation.longitude);}else{// 数据为空时显示 Toastthis.getUIContext().getPromptAction().showToast({message:$r('app.string.Stay_tuned')// 使用资源字符串});}})

1.3 Toast 完整配置

this.getUIContext().getPromptAction().showToast({message:'这是一条提示信息',// 必填:提示内容duration:2000,// 显示时长(ms)bottom:'200px',// 距底部的距离(可选)showMode:promptAction.ToastShowMode.TOP_MOST,// 显示模式alignment:Alignment.Bottom,// 对齐方式offset:{dx:0,dy:-50}// 偏移量});

1.4 封装一个通用 Toast 工具

// ToastUtil.etsimport{promptAction}from'@kit.ArkUI';exportclassToastUtil{staticsuccess(message:string):void{promptAction.showToast({message:`${message}`,duration:2000});}staticerror(message:string):void{promptAction.showToast({message:`${message}`,duration:3000});}staticinfo(message:string):void{promptAction.showToast({message:`ℹ️${message}`,duration:2000});}staticwarning(message:string):void{promptAction.showToast({message:`⚠️${message}`,duration:2500});}}// 使用ToastUtil.success('保存成功');ToastUtil.error('网络连接失败,请重试');

二、AlertDialog:确认对话框

2.1 单按钮对话框

AlertDialog.show({title:'提示',message:'操作成功!',autoCancel:true,// 点击遮罩层是否关闭confirm:{value:'确定',action:()=>{console.log('用户点击了确定');}}});

2.2 双按钮(确认/取消)

AlertDialog.show({title:'删除确认',message:'确定要删除这条加油记录吗?此操作不可撤销。',autoCancel:false,// 点击遮罩不关闭(强制选择)primaryButton:{value:'取消',fontColor:'#666666',action:()=>{console.log('取消删除');}},secondaryButton:{value:'删除',fontColor:'#FF4D4F',// 危险操作用红色action:()=>{console.log('确认删除');this.deleteRecord();}}});

2.3 通过 PromptAction 的 showDialog

// 更灵活的方式:支持多个按钮this.getUIContext().getPromptAction().showDialog({title:'选择定位方式',message:'请选择获取位置的方式',buttons:[{text:'GPS高精度',color:'#1A6FF5'},{text:'网络定位',color:'#52C41A'},{text:'取消',color:'#999999'}]}).then(result=>{switch(result.index){case0:console.log('选择了GPS');break;case1:console.log('选择了网络定位');break;case2:console.log('取消');break;}});

三、自定义 Dialog(CustomDialog)

3.1 定义自定义弹窗

// 自定义加油站选择弹窗@CustomDialogstruct StationSelectDialog{controller:CustomDialogController=newCustomDialogController({builder:StationSelectDialog()});onSelect:(stationId:string)=>void=()=>{};privatestations=[{id:'001',name:'中国石化',icon:'⛽',discount:'立减0.1元/升'},{id:'002',name:'中国石油',icon:'⛽',discount:'积分翻倍'},{id:'003',name:'壳牌',icon:'⛽',discount:'无优惠'},];build(){Column({space:0}){// 标题区Row(){Text('选择品牌').fontSize(18).fontWeight(FontWeight.Bold).layoutWeight(1)Image($r('app.media.back')).width(24).height(24).onClick(()=>{this.controller.close();})}.padding({left:20,right:20,top:20,bottom:16})Divider().strokeWidth(0.5).color('#F0F0F0')// 列表区Column({space:0}){ForEach(this.stations,(station:Record<string,string>)=>{Row({space:12}){Text(station['icon']asstring).fontSize(28)Column({space:4}){Text(station['name']asstring).fontSize(16).fontWeight(FontWeight.Medium)Text(station['discount']asstring).fontSize(12).fontColor('#52C41A')}.alignItems(HorizontalAlign.Start).layoutWeight(1)Text('选择').fontSize(14).fontColor('#1A6FF5')}.padding({left:20,right:20,top:14,bottom:14}).width('100%').onClick(()=>{this.onSelect(station['id']asstring);this.controller.close();})Divider().strokeWidth(0.5).color('#F0F0F0').margin({left:20})})}// 取消按钮Text('取消').fontSize(16).fontColor('#999999').padding({top:16,bottom:24}).onClick(()=>{this.controller.close();})}.backgroundColor('#FFFFFF').borderRadius({topLeft:20,topRight:20,bottomLeft:0,bottomRight:0}).width('100%')}}// 使用自定义弹窗@Entry@Componentstruct CustomDialogDemoPage{@StateselectedBrand:string='未选择';privatedialogController:CustomDialogController=newCustomDialogController({builder:StationSelectDialog({onSelect:(id:string)=>{constmap:Record<string,string>={'001':'中国石化','002':'中国石油','003':'壳牌'};this.selectedBrand=map[id]||'未知';}}),alignment:DialogAlignment.Bottom,// 从底部弹出(sheet 风格)offset:{dx:0,dy:0},customStyle:true,// 使用自定义样式maskColor:'#80000000',// 遮罩颜色openAnimation:{duration:300,curve:Curve.EaseOut}});build(){Column({space:24}){Text('自定义弹窗示例').fontSize(20).fontWeight(FontWeight.Bold)Text(`已选品牌:${this.selectedBrand}`).fontSize(16).fontColor(this.selectedBrand==='未选择'?'#999999':'#1A6FF5')Button('选择加油品牌').onClick(()=>{this.dialogController.open();}).width('80%').height(48).backgroundColor('#1A6FF5').fontColor('#FFFFFF').borderRadius(24)}.width('100%').height('100%').justifyContent(FlexAlign.Center)}}

四、ActionSheet:底部操作菜单

ActionSheet.show({title:'选择操作',message:'请选择对该加油站的操作',autoCancel:true,confirm:{value:'取消',action:()=>{}},sheets:[{title:'查看地图路线',action:()=>{console.log('打开地图导航');}},{title:'收藏加油站',action:()=>{console.log('添加到收藏');}},{title:'分享给朋友',action:()=>{console.log('分享');}},{title:'举报问题',action:()=>{console.log('举报');}}]});

五、弹窗类型选择指南

场景推荐弹窗原因
操作结果提示(成功/失败)Toast轻量,不打断操作流
确认危险操作(删除等)AlertDialog强制用户选择
简单信息展示AlertDialog(单按钮)清晰明确
多选项操作菜单ActionSheet移动端标准模式
复杂自定义内容CustomDialog完全控制样式
半屏内容(列表/表单)bindSheet项目实际使用

总结

HarmonyOS 提供了丰富的弹窗体系:showToast适合轻量反馈、AlertDialog适合确认操作、ActionSheet适合多选项菜单、CustomDialog适合复杂自定义内容。本项目使用showToast+bindSheet的组合——Toast 提示轻量信息,bindSheet 展示加油站列表——是一种简洁而有效的 UI 设计方案。根据交互的权重选择合适的弹窗类型,是打磨产品体验的关键细节。

http://www.jsqmd.com/news/984022/

相关文章:

  • 遗传算法进阶核心:选择压力、适应度缩放与精英策略实战解析
  • 2026北京市昌平区家里卫生间漏水、阳台漏水、楼顶漏水、阳台漏水、地下室渗水、阳光房漏水各种房屋漏水情况不用愁!本地防水补漏公司为您排忧解难!精准推荐附近专业防水团队 - 防水百科
  • LMDrive数据集构建完全指南:从零开始创建自动驾驶训练数据
  • 3分钟解锁Cursor Pro完整功能:告别试用限制的终极免费方案
  • 支付宝商家转账,提额成功
  • 如何用Point-E在5分钟内从文本生成3D点云?完整实战指南
  • 2023最新gmplot入门教程:从安装到绘制第一个交互式地图
  • 影刀RPA新手教程_Excel表格读写操作完全指南
  • 3DS宝可梦ROM编辑器:打造专属宝可梦世界的终极工具
  • GIS局部放电在线监测:让电网隐患“无处遁形”
  • 华硕笔记本终极性能调校指南:G-Helper完整教程
  • 题解:学而思编程 斐波那契字符串
  • 3分钟快速汉化Figma界面:设计师必备的终极中文插件指南
  • 2026北京市大兴区家里卫生间漏水、阳台漏水、楼顶漏水、阳台漏水、地下室渗水、阳光房漏水各种房屋漏水情况不用愁!本地防水补漏公司为您排忧解难!精准推荐附近专业防水团队 - 防水百科
  • Zerolang社区贡献指南:如何参与这个革命性编程语言的开发
  • 凡华似金创始人权明受邀出席2026第7届六六盛典暨全国头部装企生态赋能大会分享:以信任密度方程式,为全国装企老板破解增长困局 - GrowthUME
  • 京东商品监控下单神器:告别手速慢的烦恼,让jd-happy帮你自动抢购
  • Kodi IPTV Simple Client:打造智能家庭直播电视的终极指南
  • 3步解决老旧Mac无法升级macOS问题:OpenCore Legacy Patcher终极指南
  • 别再手动调格式了!用NoteExpress搞定毕业论文参考文献(附样式修改避坑指南)
  • MailCore SMTP完全指南:简单快速发送带附件的电子邮件
  • MelonLoader:解锁Unity游戏模组世界的终极钥匙,双架构兼容的革命性工具
  • 高效部署指南:ABAP2XLSX完整配置与Excel报表性能优化实战
  • AI动态简报之算力基建篇(2026.06.09)
  • 题解:学而思编程 懒惰的牛
  • 如何快速掌握Wasmtime:WebAssembly运行时完整指南
  • MauiReactor组件通信模式:掌握跨页面数据交互的5种方法
  • DeepLabV3Plus语义分割实战:从架构设计到工业级部署的完整指南
  • Sqribble:面向结构化文档的规则驱动型云操作系统
  • 补充MySQL官网知识--解锁Online VARCHAR字段扩展与Index的关系