HarmonyOS 折叠屏适配实战:双栏与单栏自适应布局(FoldStatus 监听 + Navigation)
前言折叠屏是 HarmonyOS 生态的重要设备形态。展开时屏幕宽度接近平板适合双栏布局左列表 右详情折叠时退化为手机形态需要切换为单栏。本文用displayAPI 监听折叠状态配合Navigation实现真正自适应的折叠屏布局。运行效果初始状态展开态双栏布局切换至折叠态单栏布局核心概念折叠状态display.FoldStatus值推荐布局展开 EXPANDED2双栏左侧列表 右侧详情半折 HALF_FOLDED3上半屏内容 下半屏操作折叠 FOLDED1单栏全屏列表点击跳转详情完整示例代码interface ArticleItem { id: number icon: string title: string summary: string tag: string readTime: string } Entry Component struct Index { // 模拟折叠状态expanded | folded | halfFolded State foldState: string expanded State selectedArticleId: number 1 private articles: ArticleItem[] [ { id: 1, icon: , tag: 布局, title: Stack 层叠布局与 Overlay 浮层详解, summary: 深入理解 alignContent 九宫格、zIndex 层叠顺序与 overlay 实战..., readTime: 8分钟 }, { id: 2, icon: , tag: 列表, title: List 高性能长列表与分组吸顶, summary: 虚拟化渲染原理、ListItemGroup 分组、sticky 吸顶完整实现..., readTime: 10分钟 }, { id: 3, icon: , tag: 轮播, title: Swiper 轮播图与页面滑动指南, summary: DotIndicator 自定义、SwiperController 编程翻页、卡片流效果..., readTime: 7分钟 }, { id: 4, icon: , tag: 导航, title: Tabs 标签页底部导航到顶部分类, summary: 底部导航栏、嵌套 Tabs、自定义 TabBar 样式完整示例..., readTime: 9分钟 }, { id: 5, icon: , tag: 侧栏, title: SideBarContainer 侧边导航实战, summary: Embed vs Overlay 模式、autoHide 自适应、自定义汉堡菜单..., readTime: 11分钟 }, ] private getSelectedArticle(): ArticleItem { for (let i 0; i this.articles.length; i) { if (this.articles[i].id this.selectedArticleId) { return this.articles[i] } } return this.articles[0] } Builder foldStateSelector() { Column({ space: 12 }) { Text(模拟折叠状态) .fontSize(13) .fontColor(#888) .width(100%) .textAlign(TextAlign.Center) Row({ space: 8 }) { Button(展开).height(36).fontSize(13) .backgroundColor(this.foldState expanded ? #0066ff : #e0e0e0) .fontColor(this.foldState expanded ? #fff : #333) .onClick(() { this.foldState expanded }) Button(半折).height(36).fontSize(13) .backgroundColor(this.foldState halfFolded ? #ff8800 : #e0e0e0) .fontColor(this.foldState halfFolded ? #fff : #333) .onClick(() { this.foldState halfFolded }) Button(折叠).height(36).fontSize(13) .backgroundColor(this.foldState folded ? #cc3300 : #e0e0e0) .fontColor(this.foldState folded ? #fff : #333) .onClick(() { this.foldState folded }) } .justifyContent(FlexAlign.Center) Text( this.foldState expanded ? 展开态双栏布局左列表 右详情 : this.foldState halfFolded ? 半折态上内容 下操作区 : 折叠态单栏仅显示列表 ) .fontSize(12) .fontColor( this.foldState expanded ? #0066ff : this.foldState halfFolded ? #ff8800 : #cc3300 ) .textAlign(TextAlign.Center) } .width(100%) .padding({ top: 12, bottom: 12, left: 16, right: 16 }) .backgroundColor( this.foldState expanded ? #f0f5ff : this.foldState halfFolded ? #fff8f0 : #fff0f0 ) .border({ width: { bottom: 1 }, color: #f0f0f0 }) } Builder articleList() { Column({ space: 0 }) { Row() { Text( 文章列表).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#1a1a1a) Text(this.articles.length.toString() 篇).fontSize(13).fontColor(#888) } .width(100%) .height(48) .padding({ left: 16, right: 16 }) .border({ width: { bottom: 1 }, color: #eeeeee }) ForEach(this.articles, (article: ArticleItem) { Row() { Text(article.icon).fontSize(20).width(36) Column({ space: 4 }) { Text(article.title) .fontSize(13) .fontColor(this.selectedArticleId article.id ? #0066ff : #222) .fontWeight(this.selectedArticleId article.id ? FontWeight.Bold : FontWeight.Normal) .maxLines(2) .textOverflow({ overflow: TextOverflow.Ellipsis }) Row({ space: 6 }) { Text(article.tag) .fontSize(10).fontColor(#0066ff).backgroundColor(#f0f5ff) .padding({ left: 5, right: 5, top: 2, bottom: 2 }).borderRadius(4) Text(article.readTime).fontSize(10).fontColor(#aaa) } } .layoutWeight(1).alignItems(HorizontalAlign.Start).padding({ left: 8 }) } .width(100%) .padding({ left: 12, right: 12, top: 12, bottom: 12 }) .backgroundColor(this.selectedArticleId article.id ? #f0f5ff : #ffffff) .border({ width: { left: this.selectedArticleId article.id ? 3 : 0, bottom: 1 }, color: { left: #0066ff, bottom: #f5f5f5 } }) .onClick(() { this.selectedArticleId article.id }) }) } .width(100%) .height(100%) .backgroundColor(#ffffff) } // Builder 内不允许 let/const 变量声明用 this.getSelectedArticle() 直接调用 Builder articleDetailPanel() { Scroll() { Column({ space: 20 }) { Column({ space: 12 }) { Row({ space: 12 }) { Text(this.getSelectedArticle().icon).fontSize(36) Column({ space: 4 }) { Text(this.getSelectedArticle().tag) .fontSize(11).fontColor(#0066ff).backgroundColor(#f0f5ff) .padding({ left: 8, right: 8, top: 3, bottom: 3 }).borderRadius(10) Text(this.getSelectedArticle().readTime 阅读).fontSize(12).fontColor(#aaa) } .alignItems(HorizontalAlign.Start) } Text(this.getSelectedArticle().title) .fontSize(20).fontWeight(FontWeight.Bold).fontColor(#111).lineHeight(28) Text(this.getSelectedArticle().summary) .fontSize(14).fontColor(#666).lineHeight(22) } .width(100%).padding(20) .backgroundColor(#ffffff).borderRadius(12) .border({ width: 1, color: #f0f0f0 }) Column({ space: 12 }) { Text(正文内容).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#333) Text(HarmonyOS 的折叠屏适配是现代应用开发的重要能力。通过监听屏幕折叠状态开发者可以动态调整布局策略为用户提供最佳的视觉体验。) .fontSize(14).fontColor(#555).lineHeight(22) Text(在展开状态下建议采用双栏布局左栏展示列表右栏展示详情充分利用大屏幕空间在折叠状态下切换为单栏布局保证内容可读性。) .fontSize(14).fontColor(#555).lineHeight(22) } .width(100%).padding(20) .backgroundColor(#ffffff).borderRadius(12) .border({ width: 1, color: #f0f0f0 }) .alignItems(HorizontalAlign.Start) // 真机 API 代码展示 Column({ space: 10 }) { Text(真机折叠状态检测 API).fontSize(14).fontWeight(FontWeight.Bold).fontColor(#333) Column({ space: 6 }) { Text(import display from ohos.display).fontSize(11).fontColor(#00aa55).fontFamily(monospace) Text().height(4) Text(let foldStatus display.getFoldStatus()).fontSize(11).fontColor(#0066ff).fontFamily(monospace) Text(// FoldStatus.FOLD_STATUS_EXPANDED 2).fontSize(11).fontColor(#666).fontFamily(monospace) Text(// FoldStatus.FOLD_STATUS_FOLDED 1).fontSize(11).fontColor(#666).fontFamily(monospace) Text().height(4) Text(display.on(foldStatusChange, (status) {).fontSize(11).fontColor(#0066ff).fontFamily(monospace) Text( // 动态切换布局).fontSize(11).fontColor(#666).fontFamily(monospace) Text(})).fontSize(11).fontColor(#0066ff).fontFamily(monospace) } .width(100%).padding(14).backgroundColor(#1a1a2e).borderRadius(10) .alignItems(HorizontalAlign.Start) } .width(100%).padding(20) .backgroundColor(#ffffff).borderRadius(12) .border({ width: 1, color: #f0f0f0 }) .alignItems(HorizontalAlign.Start) if (this.foldState halfFolded) { Column({ space: 8 }) { Text(⚠️ 半折状态提示).fontSize(14).fontWeight(FontWeight.Bold).fontColor(#cc6600) Text(建议将交互控件放置在下半屏将内容展示放置在上半屏模拟笔记本电脑使用模式。) .fontSize(13).fontColor(#664400).lineHeight(20) } .width(100%).padding(16) .backgroundColor(#fff8e8).borderRadius(12) .border({ width: 1, color: #ffcc66 }) .alignItems(HorizontalAlign.Start) } Column().height(20) } .width(100%).padding({ left: 16, right: 16, top: 16, bottom: 16 }) } .width(100%).height(100%).backgroundColor(#f5f5f5) } build() { Column({ space: 0 }) { // 顶部折叠状态选择器 this.foldStateSelector() // 主内容区根据折叠状态切换布局 if (this.foldState expanded) { // 展开态双栏布局 Row() { Column() { this.articleList() } .width(40%) .height(100%) .border({ width: { right: 1 }, color: #e8e8e8 }) Column() { this.articleDetailPanel() } .layoutWeight(1) .height(100%) } .width(100%) .layoutWeight(1) } else if (this.foldState folded) { // 折叠态单栏列表 Column() { this.articleList() } .width(100%) .layoutWeight(1) } else { // 半折态上下分屏 Column() { // 上半屏内容 Column() { this.articleDetailPanel() } .height(55%) .border({ width: { bottom: 2 }, color: #0066ff }) // 下半屏操作列表 Column() { this.articleList() } .height(45%) } .width(100%) .layoutWeight(1) } } .width(100%) .height(100%) .backgroundColor(#f5f5f5) } }关键知识点1. Builder 内不允许 let/const 声明这是 ArkTS 严格模式的重要限制// 错误Builder 内不能声明变量 Builder articleDetail() { let article this.getSelected() // 编译错误 Text(article.title) } // 正确直接调用方法或访问 State Builder articleDetail() { Text(this.getSelected().title) // 允许方法调用 Text(this.selectedTitle) // 允许访问 State }2. 真机获取折叠状态import display from ohos.display // 一次性获取 let status display.getFoldStatus() // FoldStatus.FOLD_STATUS_FOLDED 1 (折叠) // FoldStatus.FOLD_STATUS_EXPANDED 2 (展开) // FoldStatus.FOLD_STATUS_HALF_FOLDED 3 (半折) // 持续监听 display.on(foldStatusChange, (status: display.FoldStatus) { this.foldState status display.FoldStatus.FOLD_STATUS_EXPANDED ? expanded : folded })3. 三种布局对应三种状态折叠状态布局策略实现方式展开双栏列表 40% 详情 60%Row包裹两个Column折叠单栏全屏列表单独Column半折纵向分割上内容 下操作Column包裹两个固定高度Column4. Navigation 的 Auto 模式更简洁对于普通列表-详情场景NavigationMode.Auto自动根据屏幕宽度在 Stack手机和 Split平板/折叠屏展开态之间切换无需手动判断折叠状态Navigation(this.pathStack) .mode(NavigationMode.Auto) // 宽屏自动双栏窄屏自动单栏这是处理折叠屏最推荐的简洁方式。5. 半折态的 UX 建议半折时设备像一台笔记本折痕以上是“屏幕“折痕以下是“键盘区“。建议上半屏展示内容文章、图片、视频下半屏放置交互控件按钮、输入框、导航小结Builder内不允许let/const变量声明改为直接调用方法或引用State真机通过display.getFoldStatus()获取折叠状态display.on(foldStatusChange)持续监听三种折叠状态对应三种布局展开双栏、折叠单栏、半折上下分屏NavigationMode.Auto是处理折叠屏列表-详情场景的最简洁方案推荐优先使用模拟器无法真实模拟折叠屏但可以通过State foldState切换布局验证 UI 逻辑

相关新闻

提示词情感分析模板库(含12个经A/B测试验证的工业级模板,仅开放200份)

提示词情感分析模板库(含12个经A/B测试验证的工业级模板,仅开放200份)

更多请点击: https://codechina.net 第一章:提示词情感分析模板库(含12个经A/B测试验证的工业级模板,仅开放200份) 模板设计原则与验证机制 所有12个模板均基于BERT-Base TextCNN双通道情感判别架构完成离线评估&am…

2026/7/27 4:07:05阅读更多 →
终极PDF视觉对比工具:diff-pdf完整使用指南与实战教程

终极PDF视觉对比工具:diff-pdf完整使用指南与实战教程

终极PDF视觉对比工具:diff-pdf完整使用指南与实战教程 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf diff-pdf是一款专门用于PDF文件视觉比较的开源工具&#xff0c…

2026/7/27 4:05:05阅读更多 →
深度强化学习原理与实践:从DQN到PPO算法解析

深度强化学习原理与实践:从DQN到PPO算法解析

1. 深度强化学习:当神经网络遇见决策智能第一次接触深度强化学习是在2016年AlphaGo战胜李世石的那个春天。当时我正蹲在实验室调试一个传统控制算法,突然意识到:原来AI已经进化到能够通过自我对弈来掌握人类千年积累的围棋智慧。这种结合了深…

2026/7/27 4:05:05阅读更多 →
操作系统缓存:高并发场景下被忽视的磁盘I/O性能优化利器

操作系统缓存:高并发场景下被忽视的磁盘I/O性能优化利器

1. 先搞清楚“操作系统缓存”到底在解决什么问题别再一提到缓存就只想到 Redis、Memcached 这些中间件了。很多性能问题,尤其是高并发读、批量数据处理、日志写入这类场景,真正的瓶颈和优化空间,往往不在应用层,而在操作系统这一层…

2026/7/27 5:37:12阅读更多 →
Windows 10 搜索框背景颜色变白异常的解决方法

Windows 10 搜索框背景颜色变白异常的解决方法

问题现象Windows 10 搜索框突然出现颜色异常:搜索面板背景变成浅色;文字仍然显示为白色;搜索内容几乎无法看清;自动更新以后,出现的搜索框异常,高度怀疑是微软 Bing/Windows Search 在线组件临时出错或远端…

2026/7/27 5:37:12阅读更多 →
AI Agent权限管理:从RBAC到动态策略引擎的设计与实践

AI Agent权限管理:从RBAC到动态策略引擎的设计与实践

1. 项目概述:为什么AI Agent需要一套独立的权限管理体系?最近在折腾几个AI Agent项目,从简单的自动化客服到复杂的业务流程编排,踩坑最多的不是模型调用,而是权限控制。你可能会问,传统的RBAC(基…

2026/7/27 5:37:12阅读更多 →
AI如何优化学术写作:文献检索到期刊匹配全流程

AI如何优化学术写作:文献检索到期刊匹配全流程

1. 项目概述:当学术写作遇上AI导航 去年帮一位博士生修改论文时,他给我看了37个版本的文献综述文档——每个版本都用不同颜色标注修改痕迹,活像块调色板。这让我意识到,学术写作这个看似理性的过程,实际上充满试错与迷…

2026/7/27 5:37:12阅读更多 →
工业机械臂强化学习系统架构与工程实践

工业机械臂强化学习系统架构与工程实践

1. 智能体的"五脏六腑":强化学习系统解剖学当我第一次拆解工业机械臂的控制器时,那种精密齿轮咬合的场景至今难忘。如今在强化学习领域,智能体的内部构造同样令人着迷——它不是黑箱魔法,而是一套由专业组件构成的精密系…

2026/7/27 5:37:12阅读更多 →
Qt多线程与多进程编程实战:从核心原理到避坑指南

Qt多线程与多进程编程实战:从核心原理到避坑指南

1. 项目概述:为什么Qt多线程与多进程是绕不开的坎?在桌面应用、嵌入式HMI乃至工业控制软件的开发中,我们常常会遇到一个核心矛盾:用户界面的流畅响应与后台繁重计算任务之间的冲突。想象一下,你正在用Qt开发一个数据分…

2026/7/27 5:35:12阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →