当前位置:   article > 正文

【HarmonyOS NEXT】Tabs组件嵌套时出现一二级Tabs切换问题_harmony tab 嵌套

harmony tab 嵌套

【关键字】

Tabs组件嵌套 / Tabs切换 / 滑动 / PanGesture / controller.changeIndex

【问题描述】

  1. 一级Tabs组件下嵌套一个二级Tabs,二级Tabs第一个页面左滑或最后一个页面右滑时无法切换至一级Tabs标签。是否可以通过系统API或者自定义事件拦截处理?

  2. 如何实现内层滑动需要触发外层页面切换时,滑动过程中页面跟随滑动移动?效果如图所示。

cke_6998.png

cke_9939.png

【解决方案】

  1. 可通过PanGesture和controller.changeIndex实现一二级Tabs切换,示例代码如下:

    1. @Entry
    2. @Component
    3. struct TabsExample {
    4. @State fontColor: string = '#182431'
    5. @State selectedFontColor: string = '#007DFF'
    6. @State currentIndex: number = 0
    7. private controller: TabsController = new TabsController()
    8. @State subCurrentIndex: number = 0
    9. private subController: TabsController = new TabsController()
    10. private panOptionRight: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.Left })
    11. private panOptionLeft: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.Right })
    12. @Builder tabBuilder(index: number, name: string) {
    13. Column() {
    14. Text(name)
    15. .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
    16. .fontSize(16)
    17. .fontWeight(this.currentIndex === index ? 500 : 400)
    18. .lineHeight(22)
    19. .margin({ top: 17, bottom: 7 })
    20. Divider()
    21. .strokeWidth(2)
    22. .color('#007DFF')
    23. .opacity(this.currentIndex === index ? 1 : 0)
    24. }.width('100%')
    25. }
    26. @Builder subTabBuilder(index: number, name: string) {
    27. Column() {
    28. Text(name)
    29. .fontColor(this.subCurrentIndex === index ? this.selectedFontColor : this.fontColor)
    30. .fontSize(16)
    31. .fontWeight(this.subCurrentIndex === index ? 500 : 400)
    32. .lineHeight(22)
    33. .margin({ top: 17, bottom: 7 })
    34. Divider()
    35. .strokeWidth(2)
    36. .color('#007DFF')
    37. .opacity(this.subCurrentIndex === index ? 1 : 0)
    38. }.width('100%')
    39. }
    40. build() {
    41. Column() {
    42. Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {
    43. TabContent() {
    44. Column().width('100%').height('100%').backgroundColor('#ffb554d7')
    45. }.tabBar(this.tabBuilder(0, '首页'))
    46. TabContent() {
    47. Column(){
    48. Tabs({ barPosition: BarPosition.Start,controller: this.subController }) {
    49. TabContent() {
    50. Column().width('100%').height('100%').backgroundColor('#00CB87')
    51. // 左右拖动触发该手势事件
    52. .gesture(
    53. PanGesture(this.panOptionRight)
    54. .onActionStart((event?: GestureEvent) => {
    55. console.info('Pan start')
    56. })
    57. .onActionUpdate((event?: GestureEvent) => {
    58. if (event) {
    59. }
    60. })
    61. .onActionEnd(() => {
    62. this.controller.changeIndex(2)
    63. console.info('Pan end')
    64. })
    65. )
    66. }.tabBar(this.subTabBuilder(3, 'pink'))
    67. }
    68. .vertical(false)
    69. .barMode(BarMode.Fixed)
    70. .barWidth(360)
    71. .barHeight(56)
    72. .animationDuration(400)
    73. .onChange((index: number) => {
    74. this.subCurrentIndex = index
    75. })
    76. .width(360)
    77. .backgroundColor('#F1F3F5')
    78. }
    79. .width('100%').height('100%').backgroundColor('#00CB87')
    80. }.tabBar(this.tabBuilder(1, '详情'))
    81. TabContent() {
    82. Column().width('100%').height('100%').backgroundColor('#ffc19757')
    83. }.tabBar(this.tabBuilder(2, '我的'))
    84. }
    85. .vertical(false)
    86. .barMode(BarMode.Fixed)
    87. .barWidth(360)
    88. .barHeight(56)
    89. .animationDuration(400)
    90. .onChange((index: number) => {
    91. this.currentIndex = index
    92. })
    93. .width(360)
    94. .height(296)
    95. .margin({ top: 52 })
    96. .backgroundColor('#F1F3F5')
    97. }.width('100%')
    98. }
    99. }

  2. 可尝试调整animationDuration的值来调节想要的切换效果。

    参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-tabs-0000001821000917#ZH-CN_TOPIC_0000001821000917__%E5%B1%9E%E6%80%A7

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

闽ICP备14008679号