一文就可搞清楚的HarmonyOS NEXT解锁模态页面的“真香”操作

简介: 本文分享了在HarmonyOS NEXT原生开发中,使用模态页面解决考试答题卡显示问题的经验。模态页面分为半模态和全模态,前者适合轻量级操作(如选日期、填备注),后者适用于沉浸式场景(如查看长答题卡)。文章通过“纪念日管理”功能的代码示例,详细讲解了半模态页面的创建、生命周期与交互实现,并展示了从设计到效果的完整流程。最后总结了模态页面的三大优势:灵活适配、友好体验与高度自定义,为开发者提供实用参考。

0.前言


最近在搞考试App的HarmonyOS NEXT原生开发,卡在考试功能的答题卡显示上。一开始用弹框做答题卡,效果堪称“买家秀vs卖家秀”——丑到想给产品经理递辞职信(不是)。痛定思痛后,我发现了模态页面这个“神器”,简直打开新世界大门!今天就来和大家聊聊这玩意儿怎么玩~


1.模态页面:弹窗界的“变形金刚”🤖


想象一下:你正在打游戏(当前上下文),突然弹出一个任务面板(模态页面),既不挡住游戏画面,又能让你专注处理任务——这就是模态页面的魅力!

它是个“大面板交互式弹窗”,和普通弹窗最大的区别是内容全靠自定义,想塞多少东西塞多少(比如你的考试答题卡)。ArkUI提供了两种形态:



  • 半模态:非全屏弹窗,允许底层页面“露个脸”,适合做轻量级操作(比如选日期、填备注)。
  • 全模态:霸道总裁式全屏覆盖,必须侧滑才能退出,适合需要沉浸式操作的场景(比如看超长答题卡)。

划重点:半模态支持侧滑、点蒙层、点关闭按钮退出,全模态默认只能侧滑——专治手残党误触!



2.半模态页面:温柔的“侧边小助手”👨💻


半模态就像你的贴心小秘书,不遮挡主界面,却能帮你快速完成任务。比如做个“纪念日管理”功能,选日期、写备注一气呵成~


生命周期:弹窗的“心跳记录”📅


半模态的一生很简单:

诞生前(onWillAppear)→ 登场(onAppear)→ 消失前(onWillDisappear)→ 退场(onDisappear)

就像舞台上的演员,每个阶段都有专属BGM(回调函数),方便你随时“操控”它的状态~


代码实现:手把手教你搭一个“纪念日小助手”🚀


@Entry
@Component
struct Index {
  // 定义页面是否显示的状态(是不是很像开关?)
  @State isShow:boolean=false;
  // 选中的日期:默认今天,防止用户选“明天考试”这种魔幻操作
  @State selectedDate:Date=new Date();
  // 备注信息:留空,等用户吐槽用
  @State remark:string="";

  // 创建半模态页面的方法:就像搭积木,把组件堆起来
  @Builder
  createSheet() {
    Column({ space10 }) { // 列布局,组件上下排,间距10px
      Row({ space10 }) { // 行布局,组件左右排,间距10px
        Text("纪念日:"// 标签,告诉用户这是选日期的地方
        // 日历选择器:右边对齐,字体颜色骚气红,点击能选日期
        CalendarPicker({ hintRadius10selectedthis.selectedDate })
          .edgeAlign(CalendarAlign.END)
          .textStyle({ color"#ff182431"font: { size20weight: FontWeight.Normal } })
          .margin(10)
          .onChange((value) => { // 选完日期打印日志,方便debug
            console.info("CalendarPicker onChange:" + JSON.stringify(value))
          })
      }
      .margin({ top30 }) // 上边距30px,和上面的组件隔开
      .width("90%"// 宽度占父容器90%,防止撑破屏幕

      Row() { // 备注输入框区域
        Text("备注:"// 标签
        TextInput({ placeholder"请输入备注信息" }) // 输入框,提示用户“快写点什么”
          .onChange(v => { // 输入内容实时更新到remark变量
            this.remark = v
          })
      }
      .width("90%"// 同样占90%宽度

      // 确认保存按钮:点击后弹Toast,关闭弹窗
      Button("确认保存")
        .width("80%"// 按钮窄一点,显得精致
        .onClick(() => {
          this.getUIContext().getPromptAction().showToast({
            message"纪念日:" + this.selectedDate.toDateString() + " 备注:" + this.remark
          })
          this.isShow = false// 关闭弹窗,世界清净
        })
    }
    .width("90%"// 整个半模态内容区占90%宽度
    .padding(20// 内边距20px,防止内容挤成一团
  }

  // 主页面布局:一个按钮,点击打开半模态
  build() {
    Column({ space:20}){
      Text("半模态页面"// 标题,简单粗暴
      Button("打开半模态页面"// 按钮,点击触发“开关”
        .bindSheet($$this.isShow,this.createSheet,
          { mode:SheetMode.EMBEDDED, detents: [SheetSize.MEDIUM, SheetSize.LARGE, 300]})
        .onClick(()=>// 点击时把“开关”打开(isShow设为true)
          this.isShow=true;
        })
    }
    .height('100%'// 撑满屏幕高度
    .width('100%'// 撑满屏幕宽度
  }
}



效果预览:从“丑拒”到“真香”的蜕变📱



  • 打开前:主页面干干净净,只有一个“打开”按钮,像等待拆封的快递盒。
  • 打开后:半模态从底部滑出,带着日历和输入框,仿佛弹出一个“秘密小抽屉”。
  • 操作中:滑动选择日期、输入备注,底层页面“虚化”但不消失,随时提醒你“我还在这儿呢”。
  • 关闭时:侧滑、点蒙层或点击按钮,弹窗顺滑消失,仿佛一切没发生过(但数据已经保存啦~)。

总结:模态页面为什么香?🤔



  • 灵活度高:半模态/全模态随意切换,适配不同场景(考试答题卡用全模态,选日期用半模态)。
  • 体验友好:不遮挡主界面,操作逻辑符合直觉(侧滑关闭超顺手)。
  • 自定义强:从布局到交互全靠自己写,想多酷炫就多酷炫(比如给答题卡加个滑动翻页效果)。

下次准备聊聊全模态页面的实战案例,比如如何用它做一个“沉浸式考试答题卡”~如果你在开发中遇到什么奇葩问题,欢迎留言吐槽,咱们一起搞事情!💪


君志所向,一往无前! 我是Feri,一个专注程序员成长的老司机,下次见~🚗💨


相关文章
|
28天前
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
94 0
|
1月前
|
缓存 移动开发 网络协议
纯血鸿蒙NEXT即时通讯/IM系统:RinbowTalk正式发布,全源码、纯ArkTS编写
RainbowTalk是一套基于MobileIMSDK的产品级鸿蒙NEXT端IM系统,目前已正式发布。纯ArkTS、从零编写,无套壳、没走捷径,每一行代码都够“纯”(详见:《RainbowTalk详细介绍》)。 MobileIMSDK是一整套开源IM即时通讯框架,历经10年,超轻量级、高度提炼,一套API优雅支持 UDP 、TCP 、WebSocket 三种协议,支持 iOS、Android、H5、标准Java、小程序、Uniapp、鸿蒙NEXT,服务端基于Netty编写。
108 1
|
编译器
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
本文介绍在三层架构中实现模块依赖的步骤。首先在产品定制层(features)的oh-package.json5文件中导入共享包依赖,如"basic":"file:../../commons/basic"。然后在产品层(products)的配置文件中同时导入公共能力层和产品定制层的依赖,示例展示了如何添加"basic"和"my"两个依赖项。通过这些配置,三层架构的各模块之间建立了完整的依赖关系。
113 0
鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
|
2月前
|
存储 开发者
鸿蒙Next仓颉开发语言中的数据类型总结分享
仓颉语言数据类型包括多种数字类型(Int、Float)、字符串(String)、数组(Array、ArrayList、ObservedArrayList)及HashMap。数字类型区分长度和精度,数组支持固定与动态操作,HashMap用于存储键值对。适合开发者快速掌握仓颉基础数据结构。#仓颉 #HarmonyOS
详解鸿蒙Next仓颉开发语言中的全屏模式
仓颉开发语言实现全屏模式教程:默认非全屏,需手动设置沉浸模式以占满屏幕。通过`setWindowLayoutFullScreen`开启全屏,并利用`getWindowAvoidArea`获取摄像头与导航条区域高度,结合AppStorage保存尺寸,适配界面布局,避免内容被遮挡。附屏幕尺寸获取方法及单位说明。
|
2月前
|
容器
鸿蒙Next仓颉语言开发实战教程:聊天列表
本文分享了 HarmonyOS 仓颉语言实现聊天页面布局的全过程,包括顶部导航栏、动态消息列表及底部输入框的设计与代码实现,详细讲解了上中下结构布局、消息方向区分、阴影设置等内容。
鸿蒙Next仓颉语言开发实战教程:消息列表
本教程分享了使用仓颉语言开发商城应用中的消息列表页面,包含导航栏布局、消息筛选列表及消息内容列表的实现。通过Row、Scroll、List和ForEach等组件,完成页面结构搭建与数据循环渲染,适合初学者实战练习。
|
2月前
|
开发者 容器
鸿蒙Next仓颉语言开发实战教程:设置页面
本教程介绍了仓颉语言商城应用设置页面的开发,重点讲解了List容器的使用。页面分为三组列表内容,第一组直接使用ListItem实现,后两组通过ListItemGroup及自定义组件setrow完成布局。教程还演示了如何通过自定义组件提升代码复用性,并介绍了分割线divider的设置方法,帮助开发者高效构建美观的设置界面。
鸿蒙Next仓颉语言开发实战教程:订单列表
本文介绍了使用仓颉语言开发HarmonyOS商城应用的订单列表页实现方法,包含导航栏、订单类型切换和订单列表展示三部分。通过代码示例讲解了布局技巧与组件使用,适合初学者学习参考。
鸿蒙Next仓颉语言开发实战教程:下拉刷新和上拉加载更多
本文介绍了在仓颉开发语言中实现下拉刷新和上拉加载更多的方法。通过Refresh组件实现下拉刷新,结合Timer模拟网络加载;并通过监听列表滚动事件,在列表底部添加加载动画实现上拉加载更多功能。代码示例清晰实用,适用于商城等含列表交互的移动应用开发。