Implementing Menu Components in HarmonyOS ArkUI

@Entry
@Component
struct MainView {
  build() {
    Row() {
      Button('Show Menu')
        .bindMenu([
          {
            value: 'Option1',
            action: () => {
              console.info('Option1 selected')
            }
          }
        ])
    }
    .margin(20)
    .height('100%')
  }
}

Creating Custom Menu Components

While default menus provide basic functionality, they often don't meet the specific requirements of most applications. Creating custom-styled manus allows for better integration with your app's design language and user experience.

@Entry
@Component
struct MainView {
  @State isSelected: boolean = true
  private menuIcon: ResourceStr = $r("app.media.app_icon")
  private secondaryIcon: ResourceStr = $r("app.media.app_icon")
  
  @Builder
  SubMenu() {
    Menu() {
      MenuItem({ content: "Copy", labelInfo: "Ctrl+C" })
      MenuItem({ content: "Paste", labelInfo: "Ctrl+V" })
    }
  }

  @Builder
  CustomMenu(){
    Menu() {
      MenuItem({ startIcon: $r("app.media.icon"), content: "Menu Item" })
      MenuItem({ startIcon: $r("app.media.icon"), content: "Menu Item" }).enabled(false)
      MenuItem({
        startIcon: this.menuIcon,
        content: "Menu Item",
        endIcon: $r("app.media.app_icon"),
        // When builder parameter is set, it indicates a submenu is bound to this menu item
        builder: this.SubMenu.bind(this),
      })
      MenuItemGroup({ header: 'Section Header' }) {
        MenuItem({ content: "Menu Item" })
          .selectIcon(true)
          .selected(this.isSelected)
          .onChange((selected) => {
            console.info("Menu item selection changed: " + selected);
            this.secondaryIcon = $r("app.media.icon");
          })
        MenuItem({
          startIcon: $r("app.media.app_icon"),
          content: "Menu Item",
          endIcon: $r("app.media.app_icon"),
          builder: this.SubMenu.bind(this)
        })
      }
      MenuItem({
        startIcon: this.secondaryIcon,
        content: "Menu Item",
        endIcon: $r("app.media.app_icon")
      })
    }
  }

  build() {
    Row() {
      Button('Show Menu')
        .bindMenu(this.CustomMenu)
    }
    .margin(20)
    .height('100%')
  }
}

The custom menu implementation demonstrates several key features of ArkUI's menu system. You can add icons, disable items, create submenu structures, group related items, and handle selection states. The MenuItemGroup component allows for logical organization of menu options with headers, while the builder parameter enables nested menu structures.

When implementing menus in your HarmonyOS application, consider the user experience and ensure that menu options are clearly labeled and logically organized. The ability to customize appearance and behavior makes ArkUI menus flexible anough to meet various design requirements while maintaining consistency with the operating system's interaction patterns.

Posted on Sat, 17 Oct 2026 16:08:07 +0000 by zrosen88