资讯动态

升级 targetSdk 26 后弹窗突然增高:HarmonyOS 7 内置文本孤字、小语种行高与音节换行回归实战

发布时间:2026/10/19 2:09:39 来源:尧图企业网站定制
升级 targetSdk 26 后弹窗突然增高HarmonyOS 7 内置文本孤字、小语种行高与音节换行回归实战同一段提示文案targetSdkVersion 还是 25 时能稳稳落在两行升到 26.0.0 后中文不再留下单独一个字小语种行高自动撑开英文长单词还可能按音节加连字符。内容没有变Popup、Toast、Menu、Select 的高度和按钮位置却变了。这不是随机排版。华为在 HarmonyOS 7 的 UX 行为变更中明确说明当应用 targetSdkVersion 大于等于 26.0.0 时一批带内置文本的 ArkUI 组件会启用新的默认文本策略。变更覆盖中文孤字、小语种行高以及英语、意大利语等语言的长单词换行。本文给出一套可迁入“中式美食”的回归方法先把受影响组件和系统语言做成矩阵再用固定宽度、边界截图和可读的测量记录判断布局是否真的退化。当前机器只有 API 24 SDK且没有连接 HDC 设备宿主断言只验证矩阵生成、风险分类和结果归档模型不声称完成 targetSdk 26 编译、系统语言切换或设备截图。先看变化不是 Text 全局改了而是内置文本默认行为变了官方变更页把范围限定在“组件内置文本”。受影响对象包括 bindPopup、bindTips、showToast、openToast、Menu、MenuItem、Slider、Select、多个系统弹窗、Search、Hyperlink、Marquee、TextClock、Badge、Chip、SegmentButton、bindSheet 等。这和页面里自己写的 Text 不是一回事。下面这段自定义 Text 的换行策略仍由开发者配置Text(网络连接不稳定请稍后再试).width(168).fontSize(16).maxLines(3).textOverflow({overflow:TextOverflow.Ellipsis})但下面的 Popup message 由系统组件绘制文本升级 targetSdk 后会吃到新的默认策略Button(重试).bindPopup(this.popupVisible,{message:网络连接不稳定请稍后再试,width:168,placement:Placement.Bottom,messageOptions:{font:{size:16}}})因此排查时不能只搜 Text。真正需要建立清单的是“哪些业务文案进入了系统组件的内置文本参数”。targetSdk 26 带来的三类默认变化官方文档给出的版本边界是 targetSdkVersion 大于等于 26.0.0。三个变化互相独立但都会改变组件所需空间。场景变更前变更后回归风险中文孤字最后一个字可能单独占一行前一行尾字跟随到下一行避免孤字行宽分配变化行数或高度可能改变藏语、缅甸语行高不足时可能重叠或截断行高自动调整弹窗增高、按钮区下移、内容被遮挡英语、意大利语长单词按单词换行超宽单词可能截断按音节换行并用连字符连接断行位置变化自动化截图基线变化最容易漏掉的是系统语言边界。官方特别说明判断依据是系统设置的语言不是应用实际使用的语言。即使应用没有藏语或缅甸语资源系统语言切换后应用仍显示中文这段中文也可能因为新的行高策略而把容器撑高。所以“我们没有适配藏语”不能作为跳过测试的理由。案例一中文 Popup 不再孤字却把底部操作区顶下去了假设菜谱加载失败时页面用 Popup 给出提示EntryComponentstruct RecipeRetryPage{StatepopupVisible:booleanfalse;StatepopupWidth:number176;build(){Column({space:16}){Button(重新加载).id(retryButton).onClick(()this.popupVisible!this.popupVisible).bindPopup(this.popupVisible,{message:网络连接不稳定请稍后再试,width:this.popupWidth,placement:Placement.Bottom,enableArrow:true,onStateChange:(state){if(!state.isVisible)this.popupVisiblefalse;}})Row({space:12}){Button(取消)Button(重试)}.id(actionRow)}.width(100%).padding(24)}}在旧策略下最后一个“试”可能单独落在第三行。新策略会重新分配上一行末尾字符让第二行和第三行更均衡。视觉通常更好但不能据此假设高度一定不变字体缩放、宽度、中文标点和实际文案都会参与排版。不要用固定高度把新策略压回去错误修法是给 Popup 或外层卡片写死一个旧高度。这样在当前中文文案上看似恢复切换大字体或缅甸语系统环境后会直接截字。更稳的处理是给文案区域稳定宽度和合理内边距不锁死内容高度。保证操作区与内容区分离内容增高时按钮仍可见、可点击。对必须保持紧凑的场景使用自定义 Popup builder把 Text、滚动区和按钮区的约束写清楚。BuilderfunctionRetryPopupBuilder(message:string){Column({space:12}){Scroll(){Text(message).fontSize(16).lineHeight(24).width(100%)}.constraintSize({maxHeight:180})Row({space:12}){Button(稍后处理)Button(立即重试)}.width(100%).justifyContent(FlexAlign.End)}.width(280).padding(16)}自定义 builder 的意义不是绕过系统优化而是当业务确实需要可滚动内容、固定操作区和更明确的可访问性顺序时由应用承担完整布局责任。案例二系统切到缅甸语后中文 Select 和 Toast 也可能变高“应用只提供中文”往往让团队漏测系统语言。可以做一个专门的回归页把同一段中文同时放进 Select、MenuItem、Popup 和 ToastEntryComponentstruct BuiltInTextRegressionPage{StatepopupVisible:booleanfalse;privatereadonlymessage:string配送地址较远预计需要更多准备时间;build(){Column({space:20}){Select([{value:this.message},{value:到店自取}]).width(240)Menu(){MenuItem({content:this.message})MenuItem({content:收藏菜谱})}.width(240)Button(显示气泡).onClick(()this.popupVisibletrue).bindPopup(this.popupVisible,{message:this.message,width:220,onStateChange:(state){if(!state.isVisible)this.popupVisiblefalse;}})Button(显示 Toast).onClick((){this.getUIContext().getPromptAction().showToast({message:this.message,duration:2000});})}.width(100%).padding(24)}}测试时不要在应用内只切一个语言变量。需要真的修改系统语言因为这一轮默认样式由系统语言触发。至少覆盖简体中文看孤字是否消失标点是否被挤到错误位置。藏语或缅甸语系统即使页面仍显示中文也检查行高、卡片高度和按钮可见性。英语放入一个超过窄容器宽度的长单词检查连字符和断行后是否仍可读。Toast 属于短暂浮层不适合靠肉眼临时观察。目标环境应通过录屏逐帧或自动化截图留证并把系统语言、窗口宽度、字体缩放和 targetSdk 一起写进结果文件。把回归条件做成矩阵而不是记在测试人员脑子里下面的 TypeScript 模型生成可复用矩阵。它不调用 ArkUI只负责保证组合没有漏项typeComponentKindpopup|toast|menuItem|select;typeSystemLocalezh-Hans|bo|my|en;interfaceTextRegressionCase{id:string;targetSdk:25|26.0.0;component:ComponentKind;systemLocale:SystemLocale;widthVp:number;fontScale:number;expected:string[];}functionbuildCases():TextRegressionCase[]{constcomponents:ComponentKind[][popup,toast,menuItem,select];constlocales:SystemLocale[][zh-Hans,bo,my,en];constwidths:number[][160,220,320];constcases:TextRegressionCase[][];for(consttargetSdkof[25,26.0.0]asconst){for(constcomponentofcomponents){for(constsystemLocaleoflocales){for(constwidthVpofwidths){cases.push({id:[targetSdk,component,systemLocale,widthVp].join(-),targetSdk,component,systemLocale,widthVp,fontScale:1,expected:[text-visible,action-visible,no-overlap]});}}}}returncases;}如果时间有限可以先跑 26.0.0 的 48 个组合再挑业务最敏感的 Popup/Select 与 targetSdk 25 做对照。对照的价值是证明差异确实来自版本隔离而不是文案、主题或代码同步发生了变化。记录什么才能让截图有判断力每条用例至少记录下面字段interfaceTextRegressionResult{caseId:string;screenshot:string;textVisible:boolean;actionVisible:boolean;overlapDetected:boolean;clippingDetected:boolean;isolatedFinalGlyph?:boolean;hyphenatedWrap?:boolean;measuredHeightVp?:number;note:string;}functionclassify(result:TextRegressionResult):pass|review|fail{if(!result.textVisible||!result.actionVisible||result.overlapDetected||result.clippingDetected){returnfail;}if(result.isolatedFinalGlyph||result.hyphenatedWrapfalse){returnreview;}returnpass;}截图文件名也要带上下文例如targetsdk26-popup-zh-Hans-160vp-font1.0.png targetsdk26-select-my-220vp-font1.0.png targetsdk26-toast-en-320vp-font1.3.png只写“显示正常”无法复查只有截图和环境参数绑定后续换文案、字体或系统版本时才能判断基线为什么变。回归顺序先可用性再像素差文本策略升级会天然改变断行像素差一定会出现。验收顺序应该是文本是否完整、可读没有重叠或裁切。操作按钮、菜单项和关闭区域是否仍可见、可点击。弹层是否越过窗口安全区域滚动是否还能到达底部。中文是否消除孤字长单词是否出现合理连字符。最后才比较卡片高度、间距和截图差异。如果把像素一致放在第一位团队很可能会用固定高度或过小行高“修回旧图”反而破坏系统为可读性做的改进。宿主断言覆盖什么配套模型测试验证四类组件、四种系统语言、三档宽度和两个 targetSdk 能生成 96 条唯一用例。只跑 targetSdk 26 时应得到 48 条用例。每条 ID 包含版本、组件、系统语言和宽度截图不会互相覆盖。失败优先级高于 review文本、操作区、重叠、裁切任一失败都会判 fail。中文孤字和英文未出现预期连字符进入 review而不是误记通过。系统语言与应用语言是两个不同字段不能用应用 locale 替代系统 locale。targetSdk 25/26 对照保持相同文案、宽度和字体缩放。这些断言证明的是测试矩阵与结果分类逻辑不证明 ArkUI 组件在设备上的实际断行结果。目标环境验收步骤用 targetSdkVersion 25 构建对照包用 26.0.0 构建待验包除版本和必要适配外保持同一提交。在支持 HarmonyOS 7 / API 26 的目标 SDK 完成编译。在同一设备或模拟器、同一窗口宽度和字体缩放下运行回归页。依次切换简体中文、藏语、缅甸语和英语系统语言并冷启动应用。对 Popup、Toast、MenuItem、Select 分别执行 160vp、220vp、320vp 三档宽度用例。中文检查孤字与标点小语种系统检查行高、截断和操作区英语检查长单词连字符。保存截图与结果 JSON按 caseId 对齐 25/26 两组结果。只有可用性通过后再决定是否接受新的视觉基线。文件级检查表targetSdkVersion 的 25/26 对照包来自同一提交。清单包含所有使用内置文本的 Popup、Toast、Menu、Select 与系统弹窗入口。系统语言和应用语言分别记录。中文、藏语、缅甸语、英语至少各有一组。窄、中、宽三档容器覆盖关键浮层。大字体与默认字体缩放分别验证。不用固定高度压回旧布局。文本完整、操作区可见、无重叠、无裁切优先于像素一致。截图文件名包含版本、组件、系统语言、宽度和字体缩放。宿主模型、目标 SDK 编译、模拟器和真机证据分开记录。证据边界与官方资料华为官方 UX 变更页可以证明 targetSdkVersion 26.0.0 时内置文本的三类默认行为、受影响组件范围以及系统语言而非应用语言决定小语种行高策略。bindPopup 参考说明了 PopupOptions 的 message、width、messageOptions 与自定义 builderPromptAction 参考说明了 showToast、openToast、openPopup、openMenu 等系统弹层入口。HarmonyOS 7UX样式或效果的变更bindPopup气泡弹窗与 PopupOptionsPromptActionshowToast、openToast 与弹层控制

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑