当前位置:   article > 正文

Harmony开发——自定义Navication工具栏(ToolBar)_harmonyos开发设置navigation的backbuttonicon

harmonyos开发设置navigation的backbuttonicon

一、Navication组件

        Navigation组件一般作为Page页面的根容器,通过属性设置来展示页面的标题栏、工具栏、导航栏等。

  1. 子组件:可以包含子组件。从API Version 9开始,推荐与NavRouter组件搭配使用。
  2. 支持属性:除了通用属性外,还支持以下属性:title、subTitle、menus、titleMode、toolBar、hideToolBar、hideBackButton、navBarWidth、navBarPosition、mode、backButtonIcon、hideNavBar
  3. 事件:onTitleModeChange(callback: (titleMode: NavigationTitleMode) => void)、onNavBarStateChange(callback: (isVisible: boolean) => void)

二、Tabs

        通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。

  1. 接口:Tabs(value?: {barPosition?: BarPosition, index?: number, controller?: TabsController})
  2. 支持属性:除了通用属性外,还支持以下属性:vertical、scrollable、barMode、barWidth、barHeight、animationDuration
  3. 事件:onChange(event: (index: number) => void)
  4. Controller:controller: TabsController = new TabsController()

三、自定义Navigation工具栏

        Navigation的toolBar(object | CustomBuilder)用于设置工具栏内容。其参数可以是一个配置对象或者一个CustomBuilder,由于通过配置对象创建的toolBar为预设样式,所以当我们需要特殊定制toolBar的时候,就需要通过创建CustormBuilder来根据需求自己声明UI样式。例如本项目中的toolBar就需要图标和字体颜色与主题色同步。

        实现思路:

  • 首先将Tabs作为Navication的子组件
  • 声明一个@State用于记录当前激活的位置,再声明一个TabController用于控制Tabs内容的切换
  • 创建一个CustomBuilder并完成UI样式编写,然后为每一个切换按钮绑定onClick事件修改当前激活位置并调用tabController.changeIndex切换内容
  • 最后将其作为参数传入toolBar
  • 通常我们希望对Tabs的内容进行懒加载,当首次跳转某位置后才加载其内容。这时我们可以设置一个集合来记录每一个内容是否需要加载,例如:activeList = [false, false, false],当位置@State改变后将指定位置改为true。然后内容组件通过@Prop接收加载状态,当为true时加载内容,否则为等待动画

        实现代码:(部分)

  1. @Entry
  2. @Component
  3. struct Index{
  4. // 当前激活位置
  5. @State current: number = 0
  6. // Tabs的Controller
  7. private tabController: TabsController = new TabController()
  8. // toolBar的数据
  9. private toolBars: Array<string> = ["item", "item", "item"]
  10. // 加载状态
  11. @State activeList: Array<boolean> = this.toolBars.map(() => false)
  12. build() {
  13. Navigation() {
  14. Tabs({
  15. controller: this.tabController
  16. }) {
  17. ForEach(this.activeList, (isActive: boolean, index: number) => {
  18. TabContent() {
  19. // 已激活加载内容(这里简单举例)
  20. if (isActive) {
  21. Text(`我是内容${index}`)
  22. } else {
  23. Text("正在加载中...")
  24. }
  25. }
  26. }, (_, index: number) => index.toString())
  27. }
  28. .barWidth(0)
  29. .barHeight(0)
  30. }
  31. .toolBar(this.ToolBar)
  32. }
  33. // 自定义ToolBar
  34. @Builder ToolBar() {
  35. // 简单举例,具体以需求为准
  36. Row() {
  37. ForEach(this.toolBars, (item: string, index: number) => {
  38. // 判断是否激活
  39. if (this.current === index) {
  40. // 这里可以设置激活样式
  41. // 已激活不用添加点击事件
  42. Text(item)
  43. } else {
  44. Text(item)
  45. .onClick(() => {
  46. // 更改激活位置
  47. this.current = index
  48. this.tabController.changeIndex(index)
  49. !this.activeList[index] && (this.activeList[index] = true)
  50. })
  51. }
  52. })
  53. }
  54. .justifyContent(FlexAlign.SpaceBetween)
  55. }
  56. }

四、总结

        今天通过运用 Navication、Tabs、CustomBuilder等内容。简单的实现了一个自定义Navication的ToolBar。在实际的开发中,可以灵活的运用TabsController等完成对样式或功能的定制以满足项目的需求。

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

闽ICP备14008679号