HarmonyOS鸿蒙Next中如何把SideBarContainer的controlButton放进标题栏里?
HarmonyOS鸿蒙Next中如何把SideBarContainer的controlButton放进标题栏里? 从而做出下图,第二个红圈圈住的界面?

更多关于HarmonyOS鸿蒙Next中如何把SideBarContainer的controlButton放进标题栏里?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【背景知识】 抽屉型标题栏用于展示不同的分类,可以快捷地进行切换、查找。抽屉型在不同尺寸设备上呈现的效果略有差异,手机端为侧边遮罩层,平板端等大屏设备为分栏界面布局。通常效率型、办公类及内容型应用较为常用。抽屉标题栏需要配合Sidebarcontainer结合使用。
HMRouter底层对系统Navigation进行封装,集成了Navigation、NavDestination、NavPathStack的系统能力,提供了可复用的路由拦截、页面生命周期、自定义转场动画,并且在跳转传参、额外的生命周期、服务型路由方面对系统能力进行了扩展,同时开发者可以高效的将历史代码中的Navigation组件接入到HMRouter框架中。
【解决方案】 先使用ohpm安装依赖如下:
ohpm install @hadss/hmrouter
Index.ets文件:
import {Index2} from './TabPage'
@Entry
@Component
struct SideBarContainerExample {
normalIcon: Resource = $r("app.media.startIcon");
selectedIcon: Resource = $r("app.media.startIcon");
@State arr: number[] = [1, 2, 3];
@State current: number = 1;
build() {
SideBarContainer(SideBarContainerType.Embed) {
Column() {
ForEach(this.arr, (item: number) => {
Column({ space: 5 }) {
Image(this.current === item ? this.selectedIcon : this.normalIcon).width(64).height(64)
Text("Index0" + item)
.fontSize(25)
.fontColor(this.current === item ? '#0A59F7' : '#999')
.fontFamily('source-sans-pro,cursive,sans-serif')
}
.onClick(() => {
this.current = item;
})
}, (item: string) => item)
}.width('100%')
.justifyContent(FlexAlign.SpaceEvenly)
.backgroundColor('#19000000')
Index2()
}
.controlButton({
top: 10,
})
.sideBarWidth(150)
.minSideBarWidth(50)
.maxSideBarWidth(300)
.minContentWidth(0)
.onChange((value: boolean) => {
})
.divider({ strokeWidth: '1vp', color: Color.Gray, startMargin: '4vp', endMargin: '4vp' })
}
}
TabPage.ets文件:
import { AttributeUpdater, LengthMetrics } from '@kit.ArkUI';
import { HMDefaultGlobalAnimator, HMNavigation, HMRouterMgr } from '@hadss/hmrouter';
/**
* 界面样式公用函数
*/
class NavModifier extends AttributeUpdater<NavigationAttribute> {
initializeModifier(instance: NavigationAttribute): void {
instance.mode(NavigationMode.Stack);
instance.navBarWidth('100%');
instance.titleMode(NavigationTitleMode.Mini)
instance.hideBackButton(true)
}
}
interface BuildRooms {
name: string
}
@Entry
@Component
struct Index2 {
modifier: NavModifier = new NavModifier();
private param: BuildRooms = {
name: "sy"
};
@State startPadding:number = 50
build() {
// @Entry中需要再套一层容器组件,Column或者Stack
Column() {
// 使用HMNavigation容器
HMNavigation({
homePageUrl: '',
navigationId: 'mainNavigation',
options: {
modifier: this.modifier,
title: { titleValue: "Title", titleOptions: {paddingStart:LengthMetrics.vp(this.startPadding)} },
menus: [{
value: "menu1",
}],
toolbar: [
{
value: "首页" ,
},
]
}
})
{
Row() {
Text("点击跳转")
.fontSize(50)
.onClick(() => {
HMRouterMgr.push({ pageUrl: 'pageB' })
})
}
.width('100%')
.height('100%')
.backgroundColor(Color.Yellow)
.justifyContent(FlexAlign.Center)
}
}
.height('100%')
.width('100%')
}
}
export { Index2 };
更多关于HarmonyOS鸿蒙Next中如何把SideBarContainer的controlButton放进标题栏里?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,SideBarContainer的controlButton默认在侧边栏外部。要将其放入标题栏,需自定义标题栏布局。使用自定义组件替代原标题栏,在其中添加按钮并绑定SideBarContainer的控制器逻辑,通过控制SideBarContainer的showSideBar属性来开关侧边栏。
在HarmonyOS Next中,可以通过自定义标题栏(TitleBar)的布局,将SideBarContainer的侧边栏控制按钮(controlButton)集成进去。核心思路是:隐藏默认的controlButton,并在自定义的标题栏组件中,通过SideBarContainer的控制器(SideBarContainerController)来编程控制侧边栏的显示与隐藏。
以下是实现步骤和关键代码示例:
1. 隐藏默认控制按钮
在SideBarContainer的属性中,将controlButton设置为隐藏。
SideBarContainer({
controlButton: {
left: 0, // 设置为0即可隐藏
top: 0,
width: 0,
height: 0
}
}) {
// ... 侧边栏和主内容
}
2. 创建自定义标题栏组件
创建一个自定义组件(例如CustomTitleBar),用于替代系统的标题栏。在这个组件中,你可以放置标题文本、返回按钮,以及用于控制侧边栏的按钮(如图标按钮)。
3. 通过控制器控制侧边栏
- 在构建
SideBarContainer时,通过.controller()方法为其绑定一个控制器(SideBarContainerController)。 - 将控制器通过参数传递给自定义标题栏组件。
- 在自定义标题栏组件的按钮事件(例如
onClick)中,调用控制器的changeSideBarState()方法来切换侧边栏的展开/收起状态。
示例代码结构:
// 1. 创建控制器
@State sidebarController: SideBarContainerController = new SideBarContainerController();
build() {
Column() {
// 2. 使用自定义标题栏,并传入控制器
CustomTitleBar({ controller: this.sidebarController })
// 3. SideBarContainer绑定控制器并隐藏默认按钮
SideBarContainer({
controlButton: {
left: 0,
top: 0,
width: 0,
height: 0
}
})
.controller(this.sidebarController) // 绑定控制器
{
// 侧边栏内容
Text('SideBar').fontSize(30)
// 主页面内容
Text('Main Content').fontSize(30)
}
}
}
在CustomTitleBar组件内部:
@Component
struct CustomTitleBar {
@Link controller: SideBarContainerController // 接收控制器
build() {
Row() {
// 返回按钮或其他元素...
Text('页面标题').fontSize(20)
Blank()
// 侧边栏控制按钮
Button('三', { type: ButtonType.Circle }) // 使用图标更佳
.onClick(() => {
// 点击时切换侧边栏状态
this.controller.changeSideBarState(true)
})
}
.padding(12)
.backgroundColor(Color.White)
}
}
关键点总结:
- 控制器绑定:
SideBarContainerController是控制侧边栏状态(显示/隐藏)的编程接口。 - 事件传递:通过组件参数将控制器传递给自定义标题栏,使其能触发侧边栏状态变更。
- 布局自由:自定义标题栏的样式、按钮位置可以完全由你设计,从而实现将控制按钮融入标题栏右侧的效果。
这种方法提供了最大的灵活性,你可以完全按照设计图来定制标题栏的视觉外观和交互逻辑。

