tabs能否标题栏宽度和底部视图宽度不一样?

如图所示,第一个红框右边有两个按钮,点击这两个按钮是跳转到另外的界面,不属于tabContent内容,目前的tabs框架好像没法实现这种界面效果,不知有没有实现方法。

tabs能否标题栏宽度和底部视图宽度不一样?-鸿蒙开发者社区

HarmonyOS
2024-10-08 11:40:37
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

demo:

@Entry  
@Component  
struct TabsExample {  
  @State fontColor: string = '#182431'  
  @State selectedFontColor: string = '#007DFF'  
  @State currentIndex: number = 0  
  private controller: TabsController = new TabsController()  
  
  @Builder  
  tabBuilder(index: number, name: string) {  
    Row() {  
      Row() {  
        if (index === 2) {  
          Text(name)  
            .textAlign(TextAlign.Center)  
              // .fontColor('#FFFFFF')  
            .width('30%')  
          Row() {  
            Image('app.media.icon')  
              .width(30).height(30)  
            Button('发布')  
              .width('50%')  
              .onClick(() => {  
                console.info('点击发布按钮')  
              })  
          }  
        } else {  
          Text(name)  
            .textAlign(TextAlign.Center)  
            .width('30%')  
          // .fontColor('#FFFFFF')  
  
        }  
      }.width('100%')  
    }.width('100%').height('100%')  
  }  
  
  build() {  
    Column() {  
      Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor('#00CB87')  
        }.tabBar(this.tabBuilder(0, '关注'))  
  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor('#007DFF')  
        }.tabBar(this.tabBuilder(1, '最新'))  
  
        TabContent() {  
          Column().width('100%').height('100%').backgroundColor('#FFBF00')  
        }.tabBar(this.tabBuilder(2, '精选'))  
      }  
      .vertical(false)  
      .barMode(BarMode.Fixed)  
      .barWidth(360)  
      .barHeight(56)  
      .animationDuration(400)  
      .onChange((index: number) => {  
        this.currentIndex = index  
      })  
      .width('100%')  
      .height(300)  
      .margin({ top: 52,right:10,left:10})  
      .backgroundColor('#F1F3F5')  
      // .backgroundColor('#000000')  
      .margin(10)  
    }.width('100%')  
  }  
}

把tab和视图分开构造布局。

const COMMUNITY_TAB_BAR_INDEX: number = 2; // 初始化社区的tab下标  
const ARC_MARGIN_TOP: number = -15; // 圆弧的上外间距为-15  
  
export class TabBarDataType {  
  id: number;  
  value: string;  
  
  constructor(id: number, value: string) {  
    this.id = id;  
    this.value = value;  
  }  
}  
  
export const TABINFO: TabBarDataType[] = [  
  new TabBarDataType(0, '关注'),  
  new TabBarDataType(1, '最新'),  
  new TabBarDataType(2,'精选'),  
];  
  
@Entry  
@Component  
struct TabViewDemo {  
  @Provide selectedIndex: number = 0; // 初始化被选定的tabBar下标  
  private controller: TabsController = new TabsController(); // 初始化Tab控制器  
  
  build() {  
    Column() {  
      Tabs({ index: this.selectedIndex, barPosition: BarPosition.End, controller: this.controller }) {  
        TabContent() {  
          Text("tab1")  
            .fontSize(26)  
        }  
  
        TabContent() {  
          Text("tab2")  
            .fontSize(26)  
        }  
  
        TabContent() {  
          Text("tab3")  
            .fontSize(26)  
        }  
  
        TabContent() {  
          Text("tab4")  
            .fontSize(26)  
        }  
  
        TabContent() {  
          Text("tab5")  
            .fontSize(26)  
        }  
      }  
      .vertical(false)  
      .scrollable(false)  
      .layoutWeight(1)  
      .backgroundColor('#ffdbd9d9')  
      .barHeight(0)  
      .onChange((index: number) => {  
        this.selectedIndex = index;  
      })  
  
      // 自定义TabBar组件  
      CustomTabBar({ selectedIndex: $selectedIndex })  
    }.width("100%")  
    .height("100%")  
  }  
}  
@Component  
struct CustomTabBar {  
  @Link selectedIndex: number; // 初始化被选定的tabBar下标  
  
  build() {  
    Row() {  
      Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {  
        ForEach(TABINFO, (item: TabBarDataType, tabIndex: number) => {  
          // 单独一个TabBar组件  
          TabItem({  
            tabBarIndex: tabIndex,  
            selectedIndex: $selectedIndex,  
          })  
        })  
      }  
      .height(60)  
      .width('60%')  
      .border({ width: 1 })  
  
      Row(){  
        Image($r('app.media.ic_home_focus'))  
          .width(26)  
          .height(26)  
        Text('发布')  
      }  
      .justifyContent(FlexAlign.SpaceAround)  
      .height(60)  
      .width('40%')  
      .border({ width: 1,color:'red' })  
    }  
    .height(60)  
    .width('100%')  
  }  
}  
  
@Component  
struct TabItem {  
  @Prop tabBarIndex: number; // tabBar下标  
  @Link selectedIndex: number; // 初始化被选定的tabBar下标  
  
  build() {  
    Column() {  
      Column() {  
        // 通过被选中的tabBar下标值和tabBar的默认下标值来改变图片显示  
        Text(TABINFO[this.tabBarIndex].value)  
          .size(  
            { width: 60, height: 60 })  
      }  
      .width(60)  
      .height(60)  
      .justifyContent(FlexAlign.Center)  
    }  
    .width(60)  
    .onClick(() => {  
      // 更新被选中的tabBar下标  
      this.selectedIndex = this.tabBarIndex;  
    })  
  }  
}
分享
微博
QQ
微信
回复
2024-10-08 16:21:29
相关问题
鸿蒙安卓有什么不一样
6478浏览 • 3回复 待解决
Web组件获取高度不一样
2318浏览 • 1回复 待解决
#鸿蒙通关秘籍#HSPHAR有啥不一样
144浏览 • 1回复 待解决