HarmonyOS Tabs BarMode枚举问题

Tabs目前BarMode有两个枚举类型,一个是Scrollable,一个是Fixed,经过测试发现barWidth设置为屏幕宽度,BarMode设置为Fixed,无论有多少tab只会平均分配barWidth,并不会超过屏幕宽度可滑动,设置为Scrollable,一个tab就占据了barWidth即屏幕宽度,可否新增一种类型,计算总tab宽度超过barWidth即可滑动,不超过即平均分barWidth。

HarmonyOS
2024-10-29 11:26:00
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

请参考下demo,看是否满足您的需要。

// xxx.ets  
@Entry  
@Component  
struct TabsExample {  
  @State scrollMargin: number = 0  
  @State layoutStyle: LayoutStyle = LayoutStyle.ALWAYS_AVERAGE_SPLIT  
  @State fontColor: string = '#182431'  
  @State selectedFontColor: string = '#007DFF'  
  @State currentIndex: number = 0  
  @State controlNums:boolean = true  
  private controller: TabsController = new TabsController()  
  
  @Builder  
  TabBuilder(index: number, name: string) {  
    Column() {  
      Text(name)  
        .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)  
        .fontSize(16)  
        .fontWeight(this.currentIndex === index ? 500 : 400)  
        .lineHeight(22)  
    }.width(100)  
  }  
  
  build() {  
    Column() {  
      Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {  
        TabContent() {  
          Column(){  
            Button("切换").onClick(() => {  
              this.controlNums = !this.controlNums  
            })  
          }.width('100%').height('100%').backgroundColor('#00CB87')  
        }.tabBar(this.TabBuilder(0, '视频1111'))  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor('#007DFF')  
        }.tabBar(this.TabBuilder(1, '游戏'))  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor('#E67C92')  
        }.tabBar(this.TabBuilder(8, '科技'))  
  
        if(this.controlNums) {  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor('#FFBF00')  
          }.tabBar(this.TabBuilder(2, '数码'))  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor('#E67C92')  
          }.tabBar(this.TabBuilder(3, '科技'))  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor('#00CB87')  
          }.tabBar(this.TabBuilder(4, '体育'))  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor('#007DFF')  
          }.tabBar(this.TabBuilder(5, '影视'))  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor('#E67C92')  
          }.tabBar(this.TabBuilder(6, '科技'))  
        }  
      }  
      .vertical(false)  
      .barMode(BarMode.Scrollable, { margin: this.scrollMargin, nonScrollableLayoutStyle: this.layoutStyle })  
      .barWidth(360)  
      .barHeight(56)  
      .animationDuration(400)  
      .onChange((index: number) => {  
        this.currentIndex = index  
      })  
      .width(360)  
      .height(296)  
      .margin({ top: 52 })  
      .backgroundColor('#F1F3F5')  
    }.width('100%')  
  }  
}

​Tabbar不滚动时,设置样式api:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-tabs-V5#layoutstyle10枚举说明

1、tab宽度不足,平均分配barwidth;宽度超过barwidth,可以滚动,可以设置。​

.barMode(BarMode.Scrollable, { nonScrollableLayoutStyle: LayoutStyle.ALWAYS_AVERAGE_SPLIT })

​参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-tabs-V5#ZH-CN_TOPIC_0000001847050116__layoutstyle10%E6%9E%9A%E4%B8%BE%E8%AF%B4%E6%98%8E

// xxx.ets  
@Entry  
@Component  
struct Index {  
  private controller: TabsController = new TabsController()  
  @State showMore: boolean = false;  
  
  build() {  
    Column() {  
      Button('展示/隐藏更多').onClick(() => {  
        this.showMore = !this.showMore;  
      })  
      Tabs({ barPosition: BarPosition.End, controller: this.controller }) {  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor(Color.Pink)  
        }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "1"))  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor(Color.Green)  
        }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "2"))  
  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor(Color.Blue)  
        }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "3333333333"))  
  
        if (this.showMore) {  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor(Color.Red)  
          }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "444444444"))  
  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor(Color.Orange)  
          }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "55555555555555"))  
  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor(Color.Yellow)  
          }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "66666666666666666"))  
  
          TabContent() {  
            Column().width('100%').height('100%').backgroundColor(Color.Blue)  
          }.tabBar(BottomTabBarStyle.of($r("sys.media.ohos_app_icon"), "7777777777777777"))  
        }  
      }  
      .animationDuration(null)  
      .height(500)  
      .backgroundColor(0xf1f3f5)  
      .barWidth('100%')  
      .barMode(BarMode.Scrollable, { nonScrollableLayoutStyle: LayoutStyle.ALWAYS_AVERAGE_SPLIT })  
    }  
    .width('100%')  
    .height('100%')  
    .padding('24vp')  
  
  }  
}

2、tabcontent滚动,联动bar切换,目前不支持,需要自行实现。

//此段代码为自定义的TabBar  
import { TopTabsList } from '../viewmodel/TopTabsModel';  
import Const from '../common/constants/CommonConstants';  
@Component  
export struct TopTabs { // 该组件作为顶部TabBar  
  @Link @Watch('onIndexChange') bottomTabIndex: number;  
  controller = new Scroller();  
  onIndexChange() {  
    this.controller.scrollToIndex(this.bottomTabIndex) // index改变时跳转到指定index位置  
  }  
  build() {  
    Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) {  
      List({ scroller: this.controller }) {  
        ForEach(TopTabsList, item => {  
          ListItem() {  
            Text(item)  
              .fontSize($r('app.float.top_font_size'))  
              .fontWeight(FontWeight.Medium)  
              .fontColor(TopTabsList.indexOf(item) == this.bottomTabIndex ? Color.Blue :$r('app.color.top_tabs_font_color')) // 切换tabContent改变颜色  
              .opacity(Const.TOP_FONT_OPACITY)  
              .margin({ left: Const.TOP_FONT_MARGIN })  
              .onClick(() => {  
                this.bottomTabIndex = TopTabsList.indexOf(item); // 点击切换tabContent  
              })  
          }  
        })  
      }  
      .width('100%')  
      .height(Const.FULL_SIZE)  
      .layoutWeight(Const.LAYOUT_WEIGHT)  
      .listDirection(Axis.Horizontal)  
    }  
    .width(Const.FULL_SIZE)  
    .height(Const.TOP_TAB_HEIGHT)  
    .alignSelf(ItemAlign.Start)  
  }  
}  
//该段代码为Tab组件  
import { TopTabs } from '../view/TopTabsComponent';  
import Const from '../common/constants/CommonConstants';  
@Component  
export struct HomeTabComponent {  
  @StorageProp('currentBreakpoint') currentBreakpoint: string = 'md';  
  @State @Watch('onIndexChange') bottomTabIndex: number = 0;  
  private controller: TabsController = new TabsController();  
  onIndexChange() {  
    this.controller.changeIndex(this.bottomTabIndex);  
  }  
  build() {  
    Column() {  
      TopTabs({ bottomTabIndex: $bottomTabIndex }) //该组件作为顶部页签,跟踪bottomTabIndex变量实现与Tab组件联动  
        .margin({ bottom: $r('app.float.top_margin') })  
      Tabs({ barPosition: BarPosition.End, index: 0, controller: this.controller }) {  
        TabContent() {  
          Text('000')  
        }  
        TabContent() {  
          Text('111')  
        }  
        TabContent() {  
          Text('222')  
        }  
        TabContent() {  
          Text('333')  
        }  
        TabContent() {  
          Text('444')  
        }  
        TabContent() {  
          Text('555')  
        }  
        TabContent() {  
          Text('666')  
        }  
        TabContent() {  
          Text('777')  
        }  
      }  
      .onChange((index: number) => {  
        this.bottomTabIndex = index;  
      })  
      .width(Const.FULL_SIZE)  
      .vertical(false)  
      .barHeight(0)  
    }  
    .width(Const.FULL_SIZE)  
  }  
}
分享
微博
QQ
微信
回复
2024-10-29 17:55:55
相关问题
Tabs barMode属性问题
168浏览 • 1回复 待解决
HarmonyOS Tabs组件嵌套Tabs组件问题
508浏览 • 1回复 待解决
HarmonyOS Tabs控件fadingEdge问题
196浏览 • 1回复 待解决
HarmonyOS Tabs组件子组件问题
190浏览 • 1回复 待解决
HarmonyOS Tabs组件的tabBar宽度问题
418浏览 • 1回复 待解决
HarmonyOS Tabs组件bar背景设置问题
179浏览 • 1回复 待解决
HarmonyOS Tabs和Web嵌套左右滑动问题
168浏览 • 1回复 待解决
HarmonyOS Tabs组件的Tab栏滚动问题
288浏览 • 1回复 待解决
Tabs组件TabContent滑到边缘问题
255浏览 • 0回复 待解决
Tabs组件懒加载的问题
2109浏览 • 1回复 待解决
关于Tabs里面tabBar样式问题
227浏览 • 2回复 待解决
Tabs滑动距离的问题有哪些?
182浏览 • 1回复 待解决
HarmonyOS Tabs组件的Tabs如何左对齐?
176浏览 • 1回复 待解决
HarmonyOS tabs阴影效果
459浏览 • 1回复 待解决
HarmonyOS tabs支持nextmargin
119浏览 • 1回复 待解决
HarmonyOS Tabs组件切换
120浏览 • 1回复 待解决