HarmonyOS 7 平行视界右侧页面被截断?先查 easy_go.json 的虚拟容器宽度

折叠屏展开后进入平行视界,左边列表、右边详情都出来了,但详情页的底部按钮有一半消失在屏幕外。把按钮宽度从 100% 改成固定 320vp 可能暂时遮住现象,却没有解释为什么同一页在手机单窗正常、在左右两页并行时出错。系统把两个页面放到一个大窗口里,旧页面如果仍按整个窗口宽度计算断点和布局,半屏中的元素就可能越界。HarmonyOS 7 的平行视界适配首先要弄清:这是配置式系统兼容方案,还是应用自己写的双栏 UI;两者处理方式不同。

本文使用官方 2026-09-04 更新的平行视界开发指导。场景以 Navigation 页面为例,演示 easy_go.json 中的 enableReducedContainerSize,再用两个可复现场景解释它不是“万能缩放开关”。这里没有把一个配置文件说成已经通过真机验证:实际效果必须在折叠屏/平板及目标 API 26 设备上检查。

整窗宽度与右侧页面容器宽度导致的工具栏截断差异

先确认你接的是哪种分栏

平行视界是系统级兼容方案:通过配置让未主动实现分栏的应用在宽屏中把一级、二级页面并排显示。应用主动分栏则由自己的 Navigation/侧栏布局控制每一列的内容和状态。官方设计说明把前者定位为快速适配,把后者定位为精细定制;别把两种方案混在一个页面里同时抢布局。若应用已有完整的双栏状态管理,贸然叠加平行视界配置,排查成本反而更高。

本文问题的前提是:已经按官方指导启用平行视界,且只有分栏态出现越界。若单窗模式也越界,先查你自己的约束;若根本没进入分栏,先查入口模块和 easyGo 引用,不要直接改 enableReducedContainerSize。

最小配置:让断点看到半屏宽度

官方要求在 entry 模块的 module.json5 中引用 profile 目录下的 EasyGo 配置。下方只展示配置核心,文件名和字段以当前工程结构为准;不要把它丢进任意 feature 模块后就期待自动生效。

{
  "common": {
    "displayModeOptions": {
      "wideWindowMode": "navigationSplit",
      "squareWindowMode": "navigationSplit",
      "navigationSplitOptions": {
        "homePage": "navBar",
        "relatedPage": "DetailPage",
        "enableReducedContainerSize": true
      }
    }
  }
}

enableReducedContainerSize 的作用不是把所有组件做视觉缩小,而是让页面的逻辑像素、横向断点和窗口宽度按分栏后的容器计算。**在这份 Navigation 配置中,它位于 navigationSplitOptions 内,不是 displayModeOptions 的同级字段。这是从官方完整配置示例核对出来的。把层级写错,JSON 仍可解析,但系统未必按你想的方式识别。配置是否生效,要看同一页面在单窗和分栏时读到的宽度,以及实际截断情况。这里的 DetailPage 只是示例路由名,必须替换成项目实际的页面标识;homePage 取值应按当前 Navigation 工程和官方指南核对。

自己先查配置结构

一个很低成本的本地检查是把 easy_go.json 当普通 JSON 解析,确认关键字段存在,避免因为少一个逗号或路径放错而进入长时间的 UI 调试。下面这段 Node 命令只校验文件结构,不模拟系统分栏。

import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';

const easyGo = JSON.parse(readFileSync('easy_go.json', 'utf8'));
const options = easyGo.common?.displayModeOptions;
const split = options?.navigationSplitOptions;
assert.equal(options?.wideWindowMode, 'navigationSplit');
assert.equal(split?.enableReducedContainerSize, true);
assert.equal(split?.homePage, 'navBar');
assert.ok(split?.relatedPage);
console.log('EasyGo key fields parsed');

把代码存为 check-easygo.mjs 并与配置放在同一目录,执行 node check-easygo.mjs。这只证明本地配置可解析且关键值正确,不能代替 module.json5 引用、打包路径和设备侧分栏效果的验收。

案例一:商品详情页底部操作条被截断

复现步骤:展开折叠屏,左侧商品列表点开右侧详情;详情页有一个按 windowWidth 计算的横向操作条。单窗时能看到完整按钮,分栏时按钮伸出右边界。先记录右侧页面实际可见宽度、业务代码拿到的宽度,以及发生溢出的组件宽度。若业务代码仍按整窗宽度排版,配置 enableReducedContainerSize 后再观察断点是否落到半屏。

这个修复有边界:页面中若有手写的 width: 1200、图片最小宽度或横向绝对定位,系统无法替你把它们变成响应式布局。应优先移除硬编码宽度,给图片和按钮明确的 max-width/自适应约束;不要让配置项替代基础的页面约束设计。

做一个 A/B 对照更容易发现真假原因:保持右侧详情页内容和设备不变,只切换 enableReducedContainerSize,分别记录详情页读到的窗口宽度、操作条实际宽度和右边界位置。如果宽度读数变化、操作条仍越界,继续查固定宽度或最小宽度;如果读数完全不变,先查 profile 文件是否打进包、module.json5 的 easyGo 引用和当前设备是否真的进入平行视界。不要把“JSON 文件存在”当作“配置生效”。

案例二:长文阅读页分栏后段落和工具栏抢空间

长文阅读页通常有目录、正文、浮动工具栏。进入平行视界后,右侧正文横向变窄,但工具栏仍按宽屏模式显示所有按钮,遮住段落。这里先看断点值:若虚拟容器已正确减半,问题不是 EasyGo 配置,而是页面在窄容器中仍强行显示宽工具栏。可以把低频命令收进菜单、为正文设最小可读宽度,并在分栏/单窗之间保留阅读位置。不要每次切换都重建阅读页,否则“文字截断”修好后又出现“阅读进度归零”。

这个案例与商品详情不同:一个是宽度来源错了,一个是宽度已经对了但内容策略没跟上。只看截图会把两个问题当成同一个“平行视界 bug”。

阅读页可以故意造一个很长的工具栏作反证:先放 8 个操作,再缩窄左右页比例。如果右侧正文宽度读数已经随分栏变化而变化,工具栏依然压住内容,就把低频动作放进溢出菜单,并验证按钮焦点顺序、字号放大、横竖屏变化。enableReducedContainerSize 不会替你决定哪些操作最重要,也不会保存阅读位置。这个对照能避免为了解决遮挡而不断尝试无关的 EasyGo 字段。

为什么有时需要退出分栏

不是所有页面都适合一分为二。官方提供 fullScreenPages,适用于需要暂时全屏的图片查看等场景;横屏页面可结合 supportLandscapeFullScreen。例如高清图全屏查看要求细节不被半屏裁掉,这时把该页面显式列为全屏比在半屏里无限缩放更合理。返回时系统恢复分栏,应用仍应核对详情选中项、滚动位置和未提交编辑是否保留。

检查点预期失败时先查
入口模块easyGo 指向打包后的配置文件路径与模块归属
分栏宽度右侧按半屏容器排版enableReducedContainerSize 与断点来源
狭窄内容工具栏仍可用、正文不截断固定宽度、最小宽度、菜单折叠
全屏例外图片页临时全屏,返回分栏fullScreenPages 与路由名
状态连续选中项、阅读位置保持页面重建与业务状态归属

参考:华为平行视界开发指导、平行视界交互与选型。本文本地只完成 JSON 结构检查;API 26 构建、设备形态与页面行为仍需真机验收。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐