• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Menu
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @Armstrong15-->
5<!--Designer: @zhanghaibo0-->
6<!--Tester: @lxl007-->
7<!--Adviser: @HelloCrease-->
8
9以垂直列表形式显示的菜单。
10
11> **说明:**
12>
13> - 该组件从API version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14>
15> - Menu组件需和[bindMenu](ts-universal-attributes-menu.md#bindmenu)或[bindContextMenu](ts-universal-attributes-menu.md#bindcontextmenu8)方法配合使用,不支持作为普通组件单独使用。
16
17## 子组件
18
19包含[MenuItem](ts-basic-components-menuitem.md)、[MenuItemGroup](ts-basic-components-menuitemgroup.md)子组件。
20
21## 接口
22
23Menu()
24
25作为菜单的固定容器,无参数。
26
27> **说明:**
28>
29> 菜单和菜单项宽度计算规则:
30>
31> 布局过程中,期望每个菜单项的宽度一致。若子组件设置了宽度,则以[尺寸计算规则](ts-universal-attributes-size.md#constraintsize)为准。
32>
33> 不设置宽度的情况:菜单组件会对子组件MenuItem、MenuItemGroup设置默认2栅格的宽度,若菜单项内容区比2栅格宽,则会自适应撑开。
34>
35> 设置宽度的情况:菜单组件会对子组件MenuItem、MenuItemGroup设置减去padding后的固定宽度。
36>
37> 设置Menu边框[width](ts-universal-attributes-size.md#width)时,支持设置的最小宽度为64vp。
38
39**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
40
41**系统能力:** SystemCapability.ArkUI.ArkUI.Full
42
43## 属性
44
45除支持[通用属性](ts-component-general-attributes.md)外,还支持以下属性:
46
47### font<sup>10+</sup>
48
49font(value: Font)
50
51统一设置Menu中所有文本的尺寸。
52
53**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
54
55**系统能力:** SystemCapability.ArkUI.ArkUI.Full
56
57**参数:**
58
59| 参数名 | 类型                     | 必填 | 说明                                                         |
60| ------ | ------------------------ | ---- | ------------------------------------------------------------ |
61| value  | [Font](ts-types.md#font) | 是   | Menu中所有文本的尺寸。<br/>默认值:<br/>{<br/>      size: 16,<br/>      family: 'HarmonyOS Sans',<br/>      weight: FontWeight.Medium,<br/>      style: FontStyle.Normal<br/>} |
62### fontColor<sup>10+</sup>
63
64fontColor(value: ResourceColor)
65
66统一设置Menu中所有文本的颜色。
67
68**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
69
70**系统能力:** SystemCapability.ArkUI.ArkUI.Full
71
72**参数:**
73
74| 参数名 | 类型                                       | 必填 | 说明                   |
75| ------ | ------------------------------------------ | ---- | ---------------------- |
76| value  | [ResourceColor](ts-types.md#resourcecolor) | 是   | Menu中所有文本的颜色。 |
77
78### radius<sup>10+</sup>
79
80radius(value: Dimension | BorderRadiuses)
81
82设置Menu边框圆角半径。
83
84**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
85
86**系统能力:** SystemCapability.ArkUI.ArkUI.Full
87
88**参数:**
89
90| 参数名 | 类型                                                         | 必填 | 说明                                                         |
91| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
92| value  | [Dimension](ts-types.md#dimension10)&nbsp;\|&nbsp;[BorderRadiuses](ts-types.md#borderradiuses9) | 是   | Menu边框圆角半径。<br/>默认值:2in1设备上默认值为8vp,其他设备上默认值为20vp。<br/> 从API version 12开始,当水平方向两个圆角半径之和的最大值大于菜单宽度,或垂直方向两个圆角半径之和的最大值大于菜单高度时,菜单四个圆角均采用菜单默认圆角半径值。<br/>当设置Dimension类型且传参为异常值时,菜单圆角取默认值。<br/>当设置BorderRadiuses类型且传参为异常值时,菜单默认没有圆角。 |
93
94### menuItemDivider<sup>12+</sup>
95
96menuItemDivider(options: DividerStyleOptions | undefined)
97
98设置menuItem分割线样式,不设置该属性则不展示分割线。
99
100startMargin + endMargin 超过组件宽度后startMargin和endMargin会被置0。
101
102**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
103
104**系统能力:** SystemCapability.ArkUI.ArkUI.Full
105
106**参数:**
107
108| 参数名     | 类型                                                     | 必填         | 说明           |
109|---------|--------------------------------------------------------|------------| -------------- |
110| options | [DividerStyleOptions](ts-types.md#dividerstyleoptions12)&nbsp;\| &nbsp;undefined | 是   | 设置menuItem分割线样式。<br />-strokeWidth:分割线的线宽。<br />-color:分割线的颜色。<br />-startMargin:分割线与menuItem侧边起端的距离。<br />-endMargin:分割线与menuItem侧边结束端的距离。<br />-mode:分割线的模式,默认值为FLOATING_ABOVE_MENU。 |
111
112### menuItemGroupDivider<sup>12+</sup>
113
114menuItemGroupDivider(options: DividerStyleOptions | undefined)
115
116设置menuItemGroup上下分割线的样式,不设置该属性则默认展示分割线。
117
118**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
119
120**系统能力:** SystemCapability.ArkUI.ArkUI.Full
121
122**参数:**
123
124| 参数名     | 类型                                                     | 必填         | 说明           |
125|---------|--------------------------------------------------------|------------| -------------- |
126| options | [DividerStyleOptions](ts-types.md#dividerstyleoptions12)&nbsp;\| &nbsp;undefined | 是   | 设置menuItemGroup顶部和底部分割线样式。<br />-strokeWidth:分割线的线宽,默认值是1px。<br />-color:分割线的颜色,默认值是 #33000000。<br />-startMargin:分割线与menuItemGroup侧边起端的距离,默认值是16。<br />-endMargin:分割线与menuItemGroup侧边结束端的距离,默认值是16。<br />-mode:分割线的模式,默认值为FLOATING_ABOVE_MENU。 |
127
128### subMenuExpandingMode<sup>12+</sup>
129
130subMenuExpandingMode(mode: SubMenuExpandingMode)
131
132设置Menu子菜单展开样式。
133
134**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
135
136**系统能力:** SystemCapability.ArkUI.ArkUI.Full
137
138**参数:**
139
140| 参数名 | 类型                         | 必填 | 说明           |
141| ------ | ---------------------------- | ---- |--------------|
142| mode  | [SubMenuExpandingMode](#submenuexpandingmode12枚举说明) | 是   | Menu子菜单展开样式。<br/>默认值:SubMenuExpandingMode.SIDE_EXPAND  |
143
144### subMenuExpandSymbol<sup>20+</sup>
145
146subMenuExpandSymbol(symbol: SymbolGlyphModifier)
147
148设置Menu子菜单展开符号。
149
150**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
151
152**系统能力:** SystemCapability.ArkUI.ArkUI.Full
153
154**参数:**
155
156| 参数名 | 类型                         | 必填 | 说明           |
157| ------ | ---------------------------- | ---- |--------------|
158| symbol  | [SymbolGlyphModifier](ts-universal-attributes-attribute-symbolglyphmodifier.md)| 是   | Menu子菜单展开符号。<br/>1、子菜单的展开样式为SubMenuExpandingMode.SIDE_EXPAND时,不显示展开符号。<br/>2、子菜单的展开样式为SubMenuExpandingMode.EMBEDDED_EXPAND时,展开时展开符号会顺时针旋转180°。<br/>默认值:`$r('sys.symbol.chevron_down').fontSize('24vp')` <br/>3、子菜单的展开样式为SubMenuExpandingMode.STACK_EXPAND时,展开时展开符号会顺时针旋转90°。<br/>默认值:`$r('sys.symbol.chevron_forward').fontSize('20vp').padding('2vp')`  |
159
160### fontSize<sup>(deprecated)</sup>
161
162fontSize(value: Length)
163
164统一设置Menu中所有文本的尺寸。
165
166从API Version 10开始废弃,建议使用[font](#font10)代替。
167
168**系统能力:** SystemCapability.ArkUI.ArkUI.Full
169
170**参数:**
171
172| 参数名 | 类型                         | 必填 | 说明                                                         |
173| ------ | ---------------------------- | ---- | ------------------------------------------------------------ |
174| value  | [Length](ts-types.md#length) | 是   | Menu中所有文本的尺寸,Length为number类型时,使用fp单位。不支持设置百分比。 |
175
176## SubMenuExpandingMode<sup>12+</sup>枚举说明
177
178Menu子菜单展开样式枚举。
179
180**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
181
182**系统能力:** SystemCapability.ArkUI.ArkUI.Full
183
184| 名称            | 值   | 说明                                       |
185| --------------- | ---- | ------------------------------------------ |
186| SIDE_EXPAND     | 0    | 默认展开样式,子菜单位于同一平面侧边展开。 |
187| EMBEDDED_EXPAND | 1    | 直接展开样式,子菜单嵌于主菜单内展开。     |
188| STACK_EXPAND    | 2    | 堆叠样式,子菜单浮于主菜单上方展开。       |
189
190## 示例
191
192### 示例1(设置多级菜单)
193
194该示例通过配置MenuItem中的builder参数实现多级菜单。
195
196```ts
197@Entry
198@Component
199struct Index {
200  @State select: boolean = true;
201  // $r('app.media.xxx')需要替换为开发者所需的图像资源文件。
202  private iconStr: ResourceStr = $r("app.media.view_list_filled");
203  private iconStr2: ResourceStr = $r("app.media.arrow_right_filled");
204
205  @Builder
206  SubMenu() {
207    Menu() {
208      MenuItem({ content: "复制", labelInfo: "Ctrl+C" })
209      MenuItem({ content: "粘贴", labelInfo: "Ctrl+V" })
210    }
211  }
212
213  @Builder
214  MyMenu(){
215    Menu() {
216      MenuItem({ startIcon: $r("app.media.icon"), content: "菜单选项" })
217      MenuItem({ startIcon: $r("app.media.icon"), content: "菜单选项" })
218        .enabled(false)
219      MenuItem({
220        startIcon: this.iconStr,
221        content: "菜单选项",
222        endIcon: this.iconStr2,
223        builder: ():void=>this.SubMenu()
224      })
225      MenuItemGroup({ header: '小标题' }) {
226        MenuItem({
227          startIcon: this.iconStr,
228          content: "菜单选项",
229          endIcon: this.iconStr2,
230          builder: ():void=>this.SubMenu()
231        })
232        MenuItem({
233          startIcon: $r("app.media.app_icon"),
234          content: "菜单选项",
235          endIcon: this.iconStr2,
236          builder: ():void=>this.SubMenu()
237        })
238      }
239      MenuItem({
240        startIcon: this.iconStr,
241        content: "菜单选项",
242      })
243    }
244  }
245
246  build() {
247    Row() {
248      Column() {
249        Text('click to show menu')
250          .fontSize(50)
251          .fontWeight(FontWeight.Bold)
252      }
253      .bindMenu(this.MyMenu)
254      .width('100%')
255    }
256    .height('100%')
257  }
258}
259```
260
261![menu](figures/menu.png)
262
263### 示例2(设置symbol类型图标)
264
265该示例通过配置symbolStartIcon、symbolEndIcon实现symbol类型图标的菜单。
266
267```ts
268// xxx.ets
269import { SymbolGlyphModifier } from '@kit.ArkUI';
270
271@Entry
272@Component
273struct Index {
274  @State startIconModifier: SymbolGlyphModifier = new SymbolGlyphModifier($r('sys.symbol.ohos_mic')).fontSize('24vp');
275  @State endIconModifier: SymbolGlyphModifier = new SymbolGlyphModifier($r('sys.symbol.ohos_trash')).fontSize('24vp');
276  @State selectIconModifier: SymbolGlyphModifier =
277    new SymbolGlyphModifier($r('sys.symbol.checkmark')).fontSize('24vp');
278  @State select: boolean = true;
279
280  @Builder
281  SubMenu() {
282    Menu() {
283      MenuItem({ content: "复制", labelInfo: "Ctrl+C" })
284      MenuItem({ content: "粘贴", labelInfo: "Ctrl+V" })
285    }
286  }
287
288  @Builder
289  MyMenu() {
290    Menu() {
291      MenuItem({ symbolStartIcon: this.startIconModifier, content: "菜单选项" })
292      MenuItem({ symbolStartIcon: this.startIconModifier, content: "菜单选项" })
293        .enabled(false)
294      MenuItem({
295        symbolStartIcon: this.startIconModifier,
296        content: "菜单选项",
297        symbolEndIcon: this.endIconModifier,
298        builder: (): void => this.SubMenu()
299      })
300      MenuItemGroup({ header: '小标题' }) {
301        MenuItem({
302          symbolStartIcon: this.startIconModifier,
303          content: "菜单选项",
304          symbolEndIcon: this.endIconModifier,
305          builder: (): void => this.SubMenu()
306        })
307        MenuItem({
308          symbolStartIcon: this.startIconModifier,
309          content: "菜单选项",
310          symbolEndIcon: this.endIconModifier,
311          builder: (): void => this.SubMenu()
312        })
313      }
314      MenuItem({
315        content: "菜单选项",
316      }).selected(this.select).selectIcon(this.selectIconModifier)
317    }
318  }
319
320  build() {
321    Row() {
322      Column() {
323        Text('click to show menu')
324          .fontSize(50)
325          .fontWeight(FontWeight.Bold)
326      }
327      .bindMenu(this.MyMenu)
328      .width('100%')
329    }
330    .height('100%')
331  }
332}
333```
334
335![zh-cn_image_0000001174582862](figures/normal-symbol.png)
336
337### 示例3(设置Menu子菜单展开符号)
338
339该示例通过配置subMenuExpandSymbol实现对Menu子菜单展开符号配置颜色。
340
341```ts
342import { SymbolGlyphModifier } from '@kit.ArkUI';
343
344@Entry
345@Component
346struct Index {
347  @State startIconModifier: SymbolGlyphModifier = new SymbolGlyphModifier($r('sys.symbol.ohos_star'))
348  @State endIconModifier: SymbolGlyphModifier = new SymbolGlyphModifier($r('sys.symbol.ohos_mic'))
349  @State expandSymbolModifier: SymbolGlyphModifier =
350    new SymbolGlyphModifier($r('sys.symbol.chevron_down')).fontColor([Color.Red]).fontSize('24vp')
351
352  @Builder
353  SubMenu() {
354    Menu() {
355      MenuItem({
356        symbolStartIcon: this.startIconModifier,
357        content: "图标"
358      })
359      MenuItem({
360        symbolStartIcon: this.startIconModifier,
361        content: "列表"
362      })
363    }.backgroundColor(Color.Grey)
364  }
365
366  @Builder
367  MyMenu() {
368    Menu() {
369      MenuItem({
370        symbolStartIcon: this.startIconModifier,
371        symbolEndIcon: this.endIconModifier,
372        content: "新建文件夹",
373        builder: (): void => this.SubMenu(),
374      })
375      MenuItem({
376        symbolStartIcon: this.startIconModifier,
377        content: "排序方式",
378        builder: (): void => this.SubMenu(),
379      })
380      MenuItem({
381        symbolStartIcon: this.startIconModifier,
382        content: "查看方式",
383        builder: (): void => this.SubMenu(),
384      })
385    }
386    .subMenuExpandingMode(SubMenuExpandingMode.EMBEDDED_EXPAND)
387    .backgroundColor(Color.Grey)
388    .subMenuExpandSymbol(this.expandSymbolModifier)
389  }
390
391  build() {
392    Button('click to show menu')
393      .position({ top: 40, left: 40 })
394      .bindMenu(this.MyMenu)
395  }
396}
397```
398
399![image](figures/menu-arrow.gif)
400
401### 示例4(设置分割线样式)
402
403该示例通过设置menuItemGroupDivider属性实现分割线样式。
404
405```ts
406import { LengthMetrics } from '@kit.ArkUI'
407
408@Entry
409@Component
410struct Index {
411
412  @Builder
413  MyMenu() {
414    Menu() {
415      MenuItem({ content: "Item Content" })
416      MenuItem({ content: "Item Content" })
417      MenuItem({ content: "Item Content" })
418      MenuItemGroup() {
419        MenuItem({ content: "Group Child" })
420        MenuItem({ content: "Group Child" })
421      }
422      MenuItem({ content: "Item Content" })
423    }
424    .menuItemDivider({
425      strokeWidth: LengthMetrics.vp(5),
426      color: '#d5d5d5',
427      mode: DividerMode.EMBEDDED_IN_MENU
428    })
429    .menuItemGroupDivider({
430      strokeWidth: LengthMetrics.vp(5),
431      color: '#707070',
432      mode: DividerMode.EMBEDDED_IN_MENU
433    })
434  }
435
436  build() {
437    RelativeContainer() {
438      Button("show menu")
439        .bindMenu(this.MyMenu())
440    }
441    .height('100%')
442    .width('100%')
443  }
444}
445```
446
447![dividerStyleMode](figures/MenudividerStyleMode.png)