HarmonyOS鸿蒙Next中如何使得Tabs中的tabBar数量较少时挨近显示,数量较多时均分显示

HarmonyOS鸿蒙Next中如何使得Tabs中的tabBar数量较少时挨近显示,数量较多时均分显示

【问题现象】

应用中有的Tabs页面的数量是通过服务端返回的结果动态显示的,tabBar的数量较多时保持均分显示,但是数量较少时希望能够挨近显示,避免有大量的留白间距影响视觉体验。

通常均分显示如下所示:

点击放大

挨近显示如下所示:

点击放大

【背景知识】

组件:

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

属性API:

barGridAlign:以栅格化方式设置tabBar的可见区域。可以参照响应式布局中的栅格布局动态调整tabBar的显示效果。

【定位思路】

  1. 因为需要修改容器组件的排版样式,从组件的属性中寻找合适的API。用barGridAlign可以以栅格化方式设置tabBar的区域,可以调整动态tabBar的排版效果。
  2. 如果没有合适的API,由于tabBar是添加到tabContent后才会显示,可以尝试把所有的tabBar删除,不用Tabs组件自带的tabBar,使用其他的容器组件来开发自定义的tabBar。

【解决方案】

方案一

设置Tabs的barGridAlign属性,根据栅格布局中对于Margin和Gutter的说明,调整两个属性的大小,以达到tabBar挨近或者均分的效果,示例代码片段如下所示:

@Entry
@Component
struct TabsView {
  // ......
  build() {
    Row() {
      Column() {
        Tabs({ controller: this.tabsController }) {
          ForEach(this.tabList, (item: string, index: number) => {
            TabContent() {
              Column()
                .width("100%")
                .height("100%")
                .backgroundColor(this.colorStrMap[item])
            }.tabBar(this.TabBarBuilder(item, index))
          }, (item: string) => item)
        }
        .width("100%")
        .height(300)
        .barGridAlign({ sm: 4, margin: this.tabList.length < 4 ? 80 : 0 })
        .onChange((index: number) => {
          this.currentIndex = index;
        })
      }
    }
  }
}

方案二

如不使用barGridAlign属性,可以把所有tabContent的tabBar删除,用其他容器组件例如Flex组件开发一个自定义的tabBar,这样就可以完全自定义样式了,示例代码片段如下所示:

@Entry
@Component
struct TabsView {
  // ......
  build() {
    Row() {
      Column() {
        Flex({
          justifyContent: this.tabList.length < 4 ? FlexAlign.Center : FlexAlign.SpaceAround,
          alignItems: ItemAlign.Center
        }) {
          ForEach(this.tabList, (item: string, index: number) => {
            this.TabBarBuilder(item, index);
          }, (item: string) => item)
        }
        .height(48)

        Tabs({ controller: this.tabsController }) {
          ForEach(this.tabList, (item: string, index: number) => {
            TabContent() {
              Column()
                .width("100%")
                .height("100%")
                .backgroundColor(this.colorStrMap[item])
            }
          }, (item: string) => item)
        }
        .barHeight(0) // tabBar高度设为0
        .width("100%")
        .height(300)
        .onChange((index: number) => {
          this.currentIndex = index;
        })
      }
    }
  }
}

【显示效果】

多个tabBar均分显示的效果如下所示:

点击放大

少量tabBar挨近显示的效果如下所示:

点击放大

【总结】

想要使得Tabs组件中的tabBar根据数量均分或者挨近显示,第一种办法是通过设置Tabs组件的barGridAlign属性调整。第二种方式是通过去掉Tabs自带的tabBar,用其他组件自行开发一个tabBar以达到样式自定义的目的。


更多关于HarmonyOS鸿蒙Next中如何使得Tabs中的tabBar数量较少时挨近显示,数量较多时均分显示的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何使得Tabs中的tabBar数量较少时挨近显示,数量较多时均分显示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,实现Tabs中tabBar数量较少时挨近显示,数量较多时均分显示

在HarmonyOS鸿蒙Next中,可以通过以下两种方式实现Tabs中tabBar数量较少时挨近显示,数量较多时均分显示:

方案一:使用Tabs组件的barGridAlign属性

根据tabBar数量动态调整margin值。示例代码片段如下:

@Entry
@Component
struct TabsView {
  build() {
    Row() {
      Column() {
        Tabs({ controller: this.tabsController }) {
          ForEach(this.tabList, (item: string, index: number) => {
            TabContent() {
              Column()
                .width("100%")
                .height("100%")
                .backgroundColor(this.colorStrMap[item])
            }.tabBar(this.TabBarBuilder(item, index))
          }, (item: string) => item)
        }
        .width("100%")
        .height(300)
        .barGridAlign({ sm: 4, margin: this.tabList.length < 4 ? 80 : 0 })
        .onChange((index: number) => {
          this.currentIndex = index;
        })
      }
    }
  }
}

方案二:使用Flex组件自定义tabBar

删除Tabs自带的tabBar,使用Flex组件自定义tabBar。示例代码片段如下:

@Entry
@Component
struct TabsView {
  build() {
    Row() {
      Column() {
        Flex({
          justifyContent: this.tabList.length < 4 ? FlexAlign.Center : FlexAlign.SpaceAround,
          alignItems: ItemAlign.Center
        }) {
          ForEach(this.tabList, (item: string, index: number) => {
            this.TabBarBuilder(item, index);
          }, (item: string) => item)
        }
        .height(48)

        Tabs({ controller: this.tabsController }) {
          ForEach(this.tabList, (item: string, index: number) => {
            TabContent() {
              Column()
                .width("100%")
                .height("100%")
                .backgroundColor(this.colorStrMap[item])
            }
          }, (item: string) => item)
        }
        .barHeight(0) // tabBar高度设为0
        .width("100%")
        .height(300)
        .onChange((index: number) => {
          this.currentIndex = index;
        })
      }
    }
  }
}
回到顶部