当前位置:   article > 正文

鸿蒙开发之下拉菜单Menu_鸿蒙下拉框

鸿蒙下拉框

鸿蒙定义了很好的下拉组件,对比原生iOS或android需要自定义来说确实简单太多了,而且原生相对自定义来说要稳定太多了。

上图来自官网案例。

一、API使用

Menu作为容器组件,内部使用MenuItem作为每一条的选项。其中,通过MenuItem控制具体的选项信息。

MenuItem可以传递参数

startIcon?: ResourceStr; //起始位置的图标

content?: ResourceStr; //内容,左侧标题

endIcon?: ResourceStr; //末尾位置的图标

labelInfo?: ResourceStr; //末尾的内容(浅灰色)

builder?: CustomBuilder; //自定义的组件,可以用作子选项
  1. Menu() {
  2. MenuItem({
  3. content: 'item2',
  4. labelInfo:'value2',
  5. builder: xxx,
  6. startIcon: $rawfile('111.png'),
  7. endIcon: $r('app.media.icon')
  8. })
  9. }

二、子选项

通过MenuItem的builder参数,绑定一个子选项

  1. @Builder subMenu() {
  2. MenuItem({content:'item1',labelInfo:'value1'})
  3. MenuItem({content:'item1',labelInfo:'value1'})
  4. }
  5. @Builder myMenu() {
  6. Menu() {
  7. MenuItem({content:'item1',labelInfo:'value1'})
  8. MenuItem({
  9. content: 'item2',
  10. builder: this.subMenu.bind(this),
  11. startIcon: $rawfile('111.png'),
  12. endIcon: $r('app.media.icon')
  13. })
  14. }
  15. }

三、菜单组

Menu内部可以放MenuItemGroup,对菜单进行分组

  1. @State menuSelected: boolean = true
  2. @Builder myMenu() {
  3. Menu() {
  4. MenuItemGroup({ header: '菜单组' }) {
  5. MenuItem({ content: "选项一" })
  6. //选中状态图标显示
  7. .selectIcon(true)
  8. //切换是否选中
  9. .selected(this.menuSelected)
  10. //切换选中回调
  11. .onChange((selected) => {
  12. console.info("menuItem select" + selected);
  13. this.menuSelected = selected
  14. })
  15. MenuItem({
  16. startIcon: $r("app.media.app_icon"),
  17. content: "选项二",
  18. endIcon: $r("app.media.icon"),
  19. })
  20. }
  21. }
  22. }

四、完整代码

  1. @Entry
  2. @Component
  3. struct OfficialMenuPage {
  4. @State menuSelected: boolean = true
  5. @Builder subMenu() {
  6. MenuItem({content:'item1',labelInfo:'value1'})
  7. MenuItem({content:'item1',labelInfo:'value1'})
  8. }
  9. @Builder myMenu() {
  10. Menu() {
  11. MenuItem({content:'item1',labelInfo:'value1'})
  12. MenuItem({
  13. content: 'item2',
  14. builder: this.subMenu.bind(this),
  15. startIcon: $rawfile('111.png'),
  16. endIcon: $r('app.media.icon')
  17. })
  18. MenuItemGroup({ header: '菜单组' }) {
  19. MenuItem({ content: "选项一" })
  20. .selectIcon(true)
  21. .selected(this.menuSelected)
  22. .onChange((selected) => {
  23. console.info("menuItem select" + selected);
  24. this.menuSelected = selected
  25. })
  26. MenuItem({
  27. startIcon: $r("app.media.app_icon"),
  28. content: "选项二",
  29. endIcon: $r("app.media.icon"),
  30. builder: this.subMenu.bind(this)
  31. })
  32. }
  33. MenuItem({
  34. startIcon: $r('app.media.app_icon'),
  35. content: "选项三",
  36. endIcon: $r("app.media.app_icon")
  37. })
  38. }
  39. }
  40. build() {
  41. Row() {
  42. Column() {
  43. Text('点击展示')
  44. .fontSize(50)
  45. .fontWeight(FontWeight.Bold)
  46. .bindMenu(this.myMenu)
  47. }
  48. .width('100%')
  49. }
  50. .height('100%')
  51. }
  52. }

五、问题

Menu组件的builder属性本来是可以用来做子选项的,但是在模拟器和预览中不能展示。一开始以为是代码问题,后来用官方代码也一样不能展示,也算是不支持模拟器和预览了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/723316
推荐阅读
相关标签
  

闽ICP备14008679号