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


