HarmonyOS鸿蒙Next中如何把SideBarContainer的controlButton放进标题栏里?

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

cke_1196.png


更多关于HarmonyOS鸿蒙Next中如何把SideBarContainer的controlButton放进标题栏里?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

【背景知识】 抽屉型标题栏用于展示不同的分类,可以快捷地进行切换、查找。抽屉型在不同尺寸设备上呈现的效果略有差异,手机端为侧边遮罩层,平板端等大屏设备为分栏界面布局。通常效率型、办公类及内容型应用较为常用。抽屉标题栏需要配合Sidebarcontainer结合使用。

HMRouter底层对系统Navigation进行封装,集成了Navigation、NavDestinationNavPathStack的系统能力,提供了可复用的路由拦截、页面生命周期、自定义转场动画,并且在跳转传参、额外的生命周期、服务型路由方面对系统能力进行了扩展,同时开发者可以高效的将历史代码中的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是控制侧边栏状态(显示/隐藏)的编程接口。
  • 事件传递:通过组件参数将控制器传递给自定义标题栏,使其能触发侧边栏状态变更。
  • 布局自由:自定义标题栏的样式、按钮位置可以完全由你设计,从而实现将控制按钮融入标题栏右侧的效果。

这种方法提供了最大的灵活性,你可以完全按照设计图来定制标题栏的视觉外观和交互逻辑。

回到顶部