HarmonyOS鸿蒙Next中Navigation的菜单点击弹出更多菜单是怎么实现的
HarmonyOS鸿蒙Next中Navigation的菜单点击弹出更多菜单是怎么实现的
类似系统文件管理的效果,点击右上角的菜单时弹出更多菜单,这种怎么实现:
联系人这里的效果简单点:
更多关于HarmonyOS鸿蒙Next中Navigation的菜单点击弹出更多菜单是怎么实现的的实战教程也可以访问 https://www.itying.com/category-93-b0.html
楼主看一下这个官方示例: https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation# 示例15navigation工具栏自适应
跑一下这个代码:
import { SymbolGlyphModifier } from '@kit.ArkUI';
@Entry
@Component
struct NavigationExample {
@Provide('navPathStack') navPathStack:NavPathStack = new NavPathStack();
@State enable: boolean = false
@State menuItems:Array<NavigationMenuItem> = [
{
value:'menuItem1',
symbolIcon: new SymbolGlyphModifier($r('sys.symbol.card_writer')),
},
{
value:'menuItem2',
symbolIcon: new SymbolGlyphModifier($r('sys.symbol.ohos_folder_badge_plus'))
},
{
value:'menuItem3',
symbolIcon: new SymbolGlyphModifier($r('sys.symbol.ohos_lungs')),
},
]
@State toolItems:Array<ToolbarItem>= [
{
value:'toolItem1',
symbolIcon:new SymbolGlyphModifier($r('sys.symbol.ohos_lungs')),
action:()=>{}
},
{
value:'toolItem2',
symbolIcon:new SymbolGlyphModifier($r('sys.symbol.card_migration')),
action:()=>{}
},
{
value:'toolItem3',
symbolIcon:new SymbolGlyphModifier($r('sys.symbol.ohos_star')),
action:()=>{}
}
]
build() {
Navigation(this.navPathStack) {
Column() {
Button('启用/关闭自适应').onClick(()=>{
this.enable = !this.enable;
})
Text("启用自适应能力:" + this.enable)
}
}
.mode(NavigationMode.Stack)
.enableToolBarAdaptation(this.enable) //是否启用工具栏自适应能力
.backButtonIcon(new SymbolGlyphModifier($r('sys.symbol.ohos_wifi')))
.titleMode(NavigationTitleMode.Mini)
.menus(this.menuItems)
.toolbarConfiguration(this.toolItems)
.title('一级页面')
}
}
更多关于HarmonyOS鸿蒙Next中Navigation的菜单点击弹出更多菜单是怎么实现的的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
- 控制不了最外层只展示一个菜单图标
@Entry
@Component
struct NavigationMenuExample {
@State navPathStack: NavigationPathStack = new NavigationPathStack();
// 菜单项点击事件
onShareClick() { console.log('分享操作'); }
onSearchClick() { console.log('搜索操作'); }
build() {
Navigation(this.navPathStack) {
Column() {
Text('主页面内容')
.fontSize(20)
}
}
.menus([
{
icon: $r('app.media.ic_share'),
action: this.onShareClick.bind(this)
},
{
icon: $r('app.media.ic_search'),
action: this.onSearchClick.bind(this)
},
// 添加更多菜单项触发折叠
{
icon: $r('app.media.ic_setting'),
action: () => console.log('设置操作')
},
{
icon: $r('app.media.ic_help'),
action: () => console.log('帮助操作')
}
])
.titleMode(NavigationTitleMode.Full)
}
}
超过3个才折叠,你这个写法连联系人的那个效果都实现不了,
1
理论上确实可以配合这个用 custombuilder 实现。
在HarmonyOS Next中,通过Navigation组件实现菜单点击弹出更多菜单的功能,可以使用自定义弹出式组件配合事件触发。具体步骤如下:
- 在Navigation组件中设置菜单项,并为其绑定点击事件。
- 在点击事件回调中,使用CustomPopupController控制自定义弹出式组件的显示/隐藏。
- 自定义弹出式组件使用@CustomDialog装饰器实现,内部布局使用Column/Row等组合所需菜单项。
- 通过position参数设置弹出位置,通常为
{ x: '100%', y: 0 }
实现右侧弹出效果。
关键代码示例:
[@CustomDialog](/user/CustomDialog)
struct MoreMenuDialog {
controller: CustomPopupController
// 自定义菜单内容
}
// 点击事件
onMenuClick() {
popupController = new CustomPopupController()
popupController.show()
}
在HarmonyOS Next中,可以通过Menu
组件配合Navigation
实现右上角菜单的弹出效果。以下是实现步骤:
- 在
Navigation
组件中添加Menu
:
import { Menu, MenuItem } from '@ohos.arkui.advanced.Menu'
@Entry
@Component
struct Sample {
@State showMenu: boolean = false
build() {
Navigation() {
// 页面内容...
}
.title('标题')
.toolbar({
items: [
{
icon: $r('app.media.more'),
action: () => { this.showMenu = true }
}
]
})
.menu(
Menu()
.show(this.showMenu)
.onChange((show: boolean) => { this.showMenu = show })
.width(180)
.height(200)
.position({ x: '90%', y: 60 })
.animation({ duration: 200, curve: Curve.Ease })
) {
MenuItem({ content: '新建文件' })
MenuItem({ content: '导入' })
MenuItem({ content: '设置' })
}
}
}
- 关键点说明:
- 使用
toolbar
属性设置右上角菜单图标 Menu
组件通过show
属性控制显示/隐藏position
设置菜单弹出位置- 每个
MenuItem
对应一个菜单项
- 联系人样式的简单实现:
.menu(
Menu()
.show(this.showMenu)
.width(120)
.position({ x: '80%', y: 50 })
) {
MenuItem({ content: '添加联系人' })
MenuItem({ content: '刷新' })
}
注意调整width
和position
参数可获得不同样式的菜单效果。