HarmonyOS鸿蒙Next中App启动后tab栏位置过高

HarmonyOS鸿蒙Next中App启动后tab栏位置过高 请问各位大佬,我试用鸿蒙Codelab中的演示项目,将EntryAbility中onWindowStageCreate里的加载页面设置为index后tab高度异常(如图),但如果保持原来的加载页面为SplashPage跳转AdvertisingPage跳转Index,则tab高度正常,这可能是什么原因导致的,又该如何修复呢?

EntryAbility.ets

...

onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
    requestFullScreen(windowStage, this.context);
    // Jump to the screen opening screen.
    windowStage.loadContent('pages/Index', (err) => {
      if (err.code) {
        hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
        return;
      }
      hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');
    });
  }
  
  ...

  function requestFullScreen(windowStage: window.WindowStage, context: Context): void {
  windowStage.getMainWindow((err: BusinessError, window: window.Window) => {
    if (err.code) {
      return;
    }
    // let windowClass: window.Window = data;
    window.setWindowLayoutFullScreen(true).catch((err:BusinessError) => {
      // TODO: Implement error handling.
      hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
      return;
    });
  });
}
Index.ets

...

build() {
    Navigation(this.pageStack) {
      Tabs({ barPosition: BarPosition.End }) {
        TabContent() {
          HomeComponent()
        }
        .tabBar(this.tabBuilder(TabId.HOME))

        TabContent() {
          MineComponent()
        }
        .tabBar(this.tabBuilder(TabId.MINE))
      }
      // .layoutWeight(1)
      .backgroundColor($r('sys.color.background_secondary'))
      .scrollable(false)
      .width(Const.THOUSANDTH_1000)
      .height(Const.THOUSANDTH_1000)
      .barWidth(Const.THOUSANDTH_940)
      .vertical(false)
      .padding({
        bottom: $r('app.float.default_20')
      })
      .divider({
        strokeWidth: 1,
        color: $r('sys.color.background_tertiary')
      })
      .onChange((index) => {
        this.currentIndex = index;
      })
    }
    .mode(NavigationMode.Stack)
  }

  @Builder
  tabBuilder(index: number) {
    Column() {
      Image(index === this.currentIndex ? NavList[index].icon_selected : NavList[index].icon)
        .width($r('app.float.default_24'))
        .height($r('app.float.default_24'))
        .objectFit(ImageFit.Contain);

      Text(NavList[index].text)
        .fontSize($r('app.float.default_10'))
        .fontWeight(FontWeight.Regular)
        .fontColor(this.currentIndex === index ? $r('app.color.text_font_color') : $r('sys.color.font_tertiary'))
        .margin({
          top: $r('app.float.default_4')
        })
    }
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
    .width(Const.THOUSANDTH_1000)
    .height(Const.THOUSANDTH_1000)
  }

图片


更多关于HarmonyOS鸿蒙Next中App启动后tab栏位置过高的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

padding去掉会有效吗?

更多关于HarmonyOS鸿蒙Next中App启动后tab栏位置过高的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你好,如果需要避让底部导航栏的话可以参考一下文档
导航栏避让常规方法

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

谢谢您回复,但我目前遇到的不是这个问题,是tab栏位置显著高于导航条的异常情况,您有遇到过这种问题吗?

这种情况可以通过使用 arkui-inspector + 开发者模式里的 显示布局边界配置排查使用

arkui-inspector 文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-arkui-inspector

.hideToolBar(true)

上一级的Navigation,应该是鸿蒙的bug

试试去掉这个padding

.padding({
        bottom: $r('app.float.default_20')
      })

在HarmonyOS Next中,App启动后tab栏位置过高通常与UI布局配置有关。检查TabContent组件的高度设置,确保其与父容器或屏幕尺寸适配。确认是否在main_pages.json中正确声明了tab页的窗口属性,避免额外边距。若使用XComponent或自定义组件,需验证其布局逻辑是否占用了顶部空间。调整TabContentlayout_weight或高度参数可解决位置偏移。

问题出在requestFullScreen函数调用时机。当直接加载Index页面时,setWindowLayoutFullScreen(true)使应用进入全屏模式,系统状态栏被隐藏,但Tabs组件未自动适配安全区域,导致tab栏位置偏高。

解决方案是在Tabs组件上添加安全区域适配:

Tabs({ barPosition: BarPosition.End }) {
  // TabContent内容
}
.safeArea(SafeAreaType.SYSTEM, { edges: ['bottom'] })

或者移除requestFullScreen调用,让系统自动处理状态栏和安全区域。如果必须全屏,需手动为Tabs组件添加底部安全区域边距:

.margin({ 
  bottom: $r('sys.float.ohos_id_elements_safe_area_system1')
})

建议优先使用安全区域适配API,确保在不同设备上正常显示。

回到顶部