HarmonyOS鸿蒙Next中FullScreenLaunchComponent里面的元服务无法沉浸式

HarmonyOS鸿蒙Next中FullScreenLaunchComponent里面的元服务无法沉浸式 嵌入到FullScreenLaunchComponent里面的元服务本身是沉浸式的,但是嵌入进来后沉浸式失效了。只有全屏的弹窗可以沉浸式,但是普通页面无法沉浸式,FullScreenLaunchComponent有什么配置可以解决这个问题吗?

6 回复

开发者您好,元服务 UX 体验标准中详细介绍了沉浸式设计的标准。如开发者需使用头部以及底部导航栏,建议开发者直接调用元服务官方提供的导航栏(AtomicServiceNavigation以及AtomicServiceTabs)控件。实现沉浸式效果中的窗口设置沉浸式显示:调用窗口强制全屏布局接口setWindowLayoutFullScreen()设置窗口为沉浸式布局。页面布局范围从安全区域扩展为整个窗口(包括状态栏和导航条),所有页面均开启全屏模式,需要开发者在各页面进行避让处理,例如使用Window.getWindowAvoidArea()方法获取避让区域的高度,设置应用页面内容的上下padding实现避让状态栏和导航条。

示例代码及更多内容请参考文档:

元服务沉浸式布局与系统安全区避让的适配方案(点击查看)

更多关于HarmonyOS鸿蒙Next中FullScreenLaunchComponent里面的元服务无法沉浸式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在元服务页面生命周期中动态设置沉浸式

对于元服务内的每个页面(尤其是普通页面),可在其 aboutToAppear 生命周期中重新启用沉浸式效果,并在 aboutToDisappear 中恢复,确保页面显示时始终处于沉浸模式。

https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-arkui-370

使用 FullScreenLaunchComponent 组件拉起嵌入式元服务时,其沉浸式效果(即内容区避让系统安全区)的行为在 API Version 12targetSdkVersion >= 20(对应HarmonyOS 6.0.0+) 发生了重要变更,旨在使嵌入式元服务与宿主应用的窗口模式保持一致。要关注宿主的沉浸设置。
参考:FullScreenLaunchComponent嵌入式运行元服务内容区避让系统安全区行为变更

目前看 FullScreenLaunchComponent 本身没有提供开启沉浸式的配置项

它的定位更像是一个全屏容器,嵌入进去的元服务实际上运行在宿主提供的窗口环境里,所以很多窗口属性(状态栏、导航栏、沉浸式能力等)会受到宿主窗口限制,而不是完全继承元服务自身的配置。

你这个现象比较像是 FullScreenLaunchComponent 创建的窗口没有把页面扩展到系统栏区域,导致页面级沉浸式失效,而弹窗因为使用了独立 Window 能正常覆盖。

建议确认几个点:

  • 元服务是否是通过独立启动时才设置沉浸式
  • 页面是否依赖 WindowStageWindow 的沉浸式配置
  • FullScreenLaunchComponent 场景下获取到的窗口对象是否发生变化
  • 在嵌入场景下打印窗口属性,看是否已经退出全屏状态

从目前公开能力来看,我没看到 FullScreenLaunchComponent 提供类似:

immersiveMode
layoutFullScreen
drawBehindSystemBar

这样的配置项。

所以如果确认是嵌入后失效,大概率不是配置问题,而是 FullScreenLaunchComponent 当前能力边界导致的。建议提一个最小 Demo 给华为工单确认是否组件用法是不是有问题。

希望能帮到你~~~

在HarmonyOS Next中,FullScreenLaunchComponent内的元服务默认使用系统级窗口容器,其窗口属性未设置沉浸式标志(如SET_TRANSLUCENT_STATUS),且元服务生命周期与启动组件绑定,无法独立控制状态栏与导航栏的透明化,因此不支持沉浸式显示。

FullScreenLaunchComponent 启动的元服务运行在独立 Window 中,默认不会继承宿主的沉浸式状态。需要在元服务入口 Ability 的 onWindowStageCreate 里,通过 window 对象主动开启全屏布局:

onWindowStageCreate(windowStage: window.WindowStage) {
  windowStage.getMainWindow().then(win => {
    win.setWindowLayoutFullScreen(true); // 启用全屏,状态栏/导航栏透明覆盖内容
  });
}

同时调整系统栏样式避免遮挡,例如:

win.setWindowSystemBarProperties({
  statusBarColor: '#00000000',
  navigationBarColor: '#00000000',
  statusBarContentColor: '#ffffff'
});

页面上需使用 .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]) 处理安全区域,保证内容不被裁切。这样元服务内普通页面即可恢复沉浸式显示。

回到顶部