开发

ArkUI 自定义导航栏完全指南:从 Navigation 到沉浸式状态栏

发布于 2026-09-12 ArkUINavigationUI

几乎每个鸿蒙应用都需要自定义导航栏:改标题样式、加搜索框、做沉浸式首页。这篇用一个完整可跑的示例,把 Navigation 容器、状态栏沉浸和安全区处理串起来。

环境说明:Navigation 方案适用于 API 12 及以上(含 HarmonyOS 26),示例建议在 DevEco Studio 26.x 新建工程中对照练习。

方案选择:Navigation 还是自绘?

API 12 之后推荐用 Navigation 作为页面容器,它和路由、转场、返回手势天然集成。如果你的页面非常简单(单页无跳转),也可以用 Stack 自绘头部,但多页面应用请直接用 Navigation,否则转场动画和手势返回都要自己造轮子。

基础结构

@Entry
@Component
struct Index {
  @State title: string = '首页';

  build() {
    Navigation() {
      Column({ space: 16 }) {
        Text('页面内容').fontSize(16)
      }
      .padding(16)
      .width('100%')
    }
    .title(this.customTitle())
    .titleMode(NavigationTitleMode.Mini)
    .hideBackButton(false)
  }

  @Builder
  customTitle() {
    Row() {
      Text(this.title)
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
    }
    .height(56)
    .padding({ left: 16 })
  }
}

.title() 接收一个自定义 Builder,想放搜索框、图标都在这里面加。NavigationTitleMode 三种模式(Free / Full / Mini)对应不同滚动行为,按需选择。

沉浸式状态栏

首页想要”图片顶到状态栏”的效果,需要在页面侧设置窗口属性:

import { window } from '@kit.ArkUI';

aboutToAppear() {
  window.getLastWindow(getContext(this)).then((win) => {
    win.setWindowLayoutFullScreen(true); // 内容延伸到状态栏下方
  });
}

关键点setWindowLayoutFullScreen(true) 之后,你的内容会被状态栏遮挡,必须手动避让。

安全区避让(新手最大的坑)

沉浸式之后获取状态栏高度:

import { window } from '@kit.ArkUI';

@State statusBarHeight: number = 0;

aboutToAppear() {
  window.getLastWindow(getContext(this)).then((win) => {
    win.setWindowLayoutFullScreen(true);
    const avoidArea = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);
    this.statusBarHeight = px2vp(avoidArea.topRect.height);
  });
}

拿到高度后给头部容器加 padding({ top: this.statusBarHeight })不要硬编码 44 或 48,不同设备、不同系统版本的状态栏高度不一样,必须动态获取。

返回手势

Navigation 内页面通过 pageStack.pop() 返回,router 那套旧 API 在新工程中逐步淘汰,新项目直接用 Navigation + 路由栈管理。

小结

自定义导航栏 = Navigation 容器 + 自定义 title Builder + 沉浸式窗口设置 + 动态安全区避让。记住两个”不要”:不要自绘导航(多页场景),不要硬编码状态栏高度。


相关阅读ArkTS 网络请求封装——页面做好了,接着接数据。


有收获的话,欢迎把本文分享给其他鸿蒙开发者。发现内容过时或有误?欢迎在评论区指出,我会持续更新。