HarmonyOS鸿蒙Next中自定义tabs点击非文字和图片区域,页面切换,文字图片未高亮

HarmonyOS鸿蒙Next中自定义tabs点击非文字和图片区域,页面切换,文字图片未高亮

import BeginnerModeTab from 'xxxx'
import ProModeTab from 'xxxx'
import AverageLawTab from 'xxxx'
import MetronomeTab from 'xxxx'

let storage = LocalStorage.getShared()

interface beginnerModeTabProps { phoneticName: string }

@Entry(storage)
@Component
struct Index {
  bottomRectHeight: string = AppStorage.get<number>('bottomRectHeight') + 'px';
  @LocalStorageLink('phoneticName') phoneticName: string = 'D';
  @State currentIndex: number = 0; // 当前tab值 
  private tabsController: TabsController = new TabsController(); // 自定义tabs 

  @Builder
  TabBuilder(title: string, targetIndex: number, selectedImg: Resource, normalImg: Resource) {
    Column() {
      Image(this.currentIndex === targetIndex ? normalImg : selectedImg).size({ width: 25, height: 25 })
      Text(title).fontColor(this.currentIndex === targetIndex ? '#fff' : '#999').fontSize(12)
    }
    .width('101%')
    .height(50)
    .justifyContent(FlexAlign.Center)
    .backgroundColor('#78c371')
    .borderWidth(0)
    .padding(0)
    .margin(0)
    .onClick(() => {
      this.currentIndex = targetIndex;
      this.tabsController.changeIndex(this.currentIndex);
    })
  }

  build() {
    Tabs({
      barPosition: BarPosition.End,
      index: this.currentIndex,
      controller: this.tabsController
    }) {
      // 初学模式 
      TabContent() {
        Column() {
          BeginnerModeTab({
            test: 'null' phoneticName: this.phoneticName
          })
        }
        .width('100%')
        .height('100%')
        .backgroundColor('#fff')
        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])

        // 图片组件的绘制区域扩展至状态栏和导航条。 
      }.tabBar(this.TabBuilder('初学模式', 0, $r('app.media.icon_mode_junior_sel'), $r('app.media.icon_mode_junior')))

      //专业模式 
      TabContent() {
        Column() {
          ProModeTab()
        }
        .width('100%')
        .height('100%')
        .backgroundColor('#3a3a3a')
        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
      }
      .tabBar(this.TabBuilder('专业模式', 1, $r('app.media.icon_mode_pro_sel'), $r('app.media.icon_mode_pro')))

      // 十二平均律 
      TabContent() {
        Column() {
          AverageLawTab()
        }
        .width('100%')
        .height('100%')
        .backgroundColor('#3a3a3a')
        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
      }
      .tabBar(this.TabBuilder('十二平均律', 2, $r('app.media.icon_mode_average_sel'), $r('app.media.icon_mode_average')))

      // 节拍器 
      TabContent() {
        Column() {
          // 添加你的内容 
          MetronomeTab()
        }
        .width('100%')
        .height('100%')
        .backgroundColor('#fff')
        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
      }
      .tabBar(this.TabBuilder('节拍器', 3, $r('app.media.icon_mode_metronome_sel'), $r('app.media.icon_mode_metronome')))
    }
    .backgroundColor('#78c371')
    .borderWidth(0)
    .padding(0)
    .margin(0)
    .scrollable(false)
    .animationDuration(0)
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
    .margin({
      top: this.bottomRectHeight,
      bottom: this.bottomRectHeight
    }) // 此处margin具体数值在实际中应与导航条区域高度保持一致 }
    aboutToAppear():
    void { 
      console.log(this.phoneticName, 'hahaha')
    }
}

更多关于HarmonyOS鸿蒙Next中自定义tabs点击非文字和图片区域,页面切换,文字图片未高亮的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

当前是选中时显示normalImg未选中时显示selectedImg吗?若是此现象还请检查下TabBuilder中的Image(this.currentIndex === targetIndex ? normalImg : selectedImg)

可以试下将TabBuilder中onClick点击事件注释掉,使用Tabs组件的onChange事件,如:

Tabs({
  barPosition: BarPosition.End,
  index: this.currentIndex,
  controller: this.tabsController
}) {
...
}
.onChange((index: number) => {
  this.currentIndex = index
})

更多关于HarmonyOS鸿蒙Next中自定义tabs点击非文字和图片区域,页面切换,文字图片未高亮的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,自定义Tabs组件时,如果点击非文字和图片区域导致页面切换,但文字和图片未高亮,可能是由于事件处理逻辑未完全覆盖或样式未正确更新。确保在Tabs的点击事件处理中,不仅处理页面切换逻辑,还更新Tabs的选中状态样式。可以通过设置选中状态的高亮样式,并在点击事件中动态切换Tabs的选中状态来实现。检查事件绑定和样式更新逻辑,确保点击任何区域都能正确触发高亮效果。

在HarmonyOS鸿蒙Next中,自定义tabs点击非文字和图片区域时页面切换但文字图片未高亮,可能是事件未正确绑定或样式未更新。建议检查点击事件是否覆盖整个tab区域,并在事件回调中更新文字和图片的样式。确保使用@State@Link装饰器管理状态,并在状态变化时重新渲染高亮效果。

回到顶部