HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏
HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏
在宽屏设备上,Navigation的mode默认处于Split模式(双栏),但是可以通过设置mode的值来切换单双栏,这里通过AttributeModifier<NavigationModifier>
来改变Navigation各属性的值,示例如下:
class NavigationMainModifier implements AttributeModifier<NavigationModifier> {
navigationMode: NavigationMode = NavigationMode.Auto;
// 成员变量navigationMode的值改变时,会自动调用此方法
applyNormalAttribute(instance: NavigationModifier): void {
instance.mode(this.navigationMode)
}
}
@Component
struct StartPage {
@State navigationMainModifier: NavigationMainModifier = new NavigationMainModifier();
...
aboutToAppear(): void {
this.pathStack.setInterception({
willShow: (from: NavDestinationContext | NavBar, to: NavDestinationContext | NavBar) => {
// 由首页发起的跳转,切换成双栏模式
if (from == 'navBar') {
this.navigationMainModifier.navigationMode = NavigationMode.Split;
// 跳转到首页,切换成单栏模式
} else if (to == 'navBar') {
this.navigationMainModifier.navigationMode = NavigationMode.Stack;
}
}
})
}
build() {
Navigation(this.pathStack) {
...
}.title('主页面')
.attributeModifier(this.navigationMainModifier)
}
}
效果如下:
完整示例如下:
import { NavigationModifier } from "@kit.ArkUI";
class NavigationMainModifier implements AttributeModifier<NavigationModifier> {
navigationMode: NavigationMode = NavigationMode.Auto;
// 成员变量navigationMode的值改变时,会自动调用此方法
applyNormalAttribute(instance: NavigationModifier): void {
instance.mode(this.navigationMode)
}
}
@ComponentV2
struct Page01 {
pathStack: NavPathStack | undefined = undefined;
build() {
NavDestination() {
Button('push 页面1').width('80%').margin({ top: 10, bottom: 10 })
.onClick(() => {
this.pathStack?.pushPath({ name: 'Page01' });
})
Button(`pop`).width('80%').margin({ top: 10, bottom: 10 })
.onClick(() => {
this.pathStack?.pop();
})
}.title('页面1')
.onReady((context: NavDestinationContext) => {
this.pathStack = context.pathStack;
})
}
}
@Entry
@Component
struct StartPage {
pathStack: NavPathStack = new NavPathStack();
@State navigationMainModifier: NavigationMainModifier = new NavigationMainModifier();
@Builder
pagesMap(name: string) {
if (name == 'Page01') {
Page01()
}
}
aboutToAppear(): void {
this.pathStack.setInterception({
willShow: (from: NavDestinationContext | NavBar, to: NavDestinationContext | NavBar) => {
// 由首页发起的跳转,切换成双栏模式
if (from == 'navBar') {
this.navigationMainModifier.navigationMode = NavigationMode.Split;
// 跳转到首页,切换成单栏模式
} else if (to == 'navBar') {
this.navigationMainModifier.navigationMode = NavigationMode.Stack;
}
}
})
}
build() {
Navigation(this.pathStack) {
Column() {
Button('push 页面1').width('80%').margin({ top: 10, bottom: 10 })
.onClick(() => {
this.pathStack.pushPath({ name: 'Page01' });
})
}
}.title('主页面')
.titleMode(NavigationTitleMode.Mini)
.mode(NavigationMode.Stack)
.attributeModifier(this.navigationMainModifier)
.navDestination(this.pagesMap)
}
}
更多关于HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏的实战教程也可以访问 https://www.itying.com/category-93-b0.html
666
更多关于HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next应用开发中,Navigation组件支持单栏和双栏布局切换。初始时设置为单栏布局,跳转后可通过配置切换为双栏布局。具体实现需在Navigation
组件中设置mode
属性为single
或split
,并在跳转时动态调整。通过Navigation
的setMode
方法或路由配置实现布局切换。
在HarmonyOS Next中,通过AttributeModifier动态调整Navigation的mode属性是正确做法。您的代码实现了从单栏(Stack)到双栏(Split)的切换逻辑,主要注意以下几点:
-
NavigationMainModifier类实现了AttributeModifier接口,通过applyNormalAttribute方法响应mode变化
-
在willShow拦截器中:
- 当从导航栏跳转时(from==‘navBar’)设置为Split双栏模式
- 当跳转回导航栏时(to==‘navBar’)设置为Stack单栏模式
- 初始通过.mode(NavigationMode.Stack)设置默认单栏模式
这种模式切换方式适合宽屏设备上的主从页面场景,首页作为主导航保持单栏,进入子页面后切换为双栏显示。注意确保pathStack正确传递到子组件。