鸿蒙仓颉开发语言实战教程:自定义tabbar

大家周末好呀,今天继续分享仓颉语言开发商城应用的实战教程,今天要做的是tabbar。

大家都知道ArkTs有Tabs和TabContent容器,能够实现上图的样式,满足基本的使用需求。而仓颉就不同了,它虽然也有这两个组件,但是它的tabbar参数只支持传入图片或者文字,不能像ArkTs那样能传入组件,所以在仓颉语言中官方的tabbar局限性非常大。

给大家实操讲解一下,下面是一段Tabs的基本写法:

Tabs(BarPosition.End, this.controller){
 TabContent(){
        Text('页面1')
    }
  TabContent(){
        Text('页面2’)
    }
}

如果你要设置tabbar的样式,需要在TabContent下添加tabbar属性,然后你会发现tabbar只有唯二的两个参数:

TabContent(){
        Text('页面1')
    }
   .tabBar(icon: CJResource, text: CJResource)

设置完之后它长这样:

这样就无法满足我们的需求,所以我们需要自定义。

每一个tabbar元素都有一个图片组件和一个文字组件,我给它写出来:

Column {
	 Image(item.selectIcon).width(28).height(28)
         Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)
    }

然后它需要有一个选中状态,难受的是仓颉不支持三元表达式,所以我只能写if语句:

Column {
        if(this.currenttabIndex == index){
            Image(item.selectIcon).width(28).height(28)
            Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)
        }else {
             Image(item.icon).width(28).height(28)
            Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)
         }
    }

它还需要一个点击事件:

Column {
        if(this.currenttabIndex == index){
            Image(item.selectIcon).width(28).height(28)
            Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)
        }else {
             Image(item.icon).width(28).height(28)
            Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)
         }
    }
.onClick({evet => this.currenttabIndex = index;this.controller.changeIndex(Int32(this.currenttabIndex))})

这样一个元素就写好了,接下来我只要循环添加几个元素,一个完整的tabbar就写好了,这里大家也要注意一下仓颉中foreach的写法:

Row {
        ForEach(this.tabList, itemGeneratorFunc: {item: TabItem, index: Int64 =>
                    Column {
                        if(this.currenttabIndex == index){
                            Image(item.selectIcon).width(28).height(28)
                            Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)
                        }else {
                             Image(item.icon).width(28).height(28)
                            Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)
                         }
                    }
                .onClick({evet => this.currenttabIndex = index;this.controller.changeIndex(Int32(this.currenttabIndex))})
    })
}
.width(100.percent)
.height(60)
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.SpaceAround)

最后我们还是需要官方的Tabs容器来添加页面,你只要不设置tabbar属性底部导航栏区域就是空白的,正好把我们自定义的tabbar放上,下面是完整的示例代码:

let tabList: Array<TabItem> = [
    TabItem(@r(app.media.shop_tab_00), @r(app.media.shop_tab_01), '首页'),
     TabItem(@r(app.media.shop_tab_10), @r(app.media.shop_tab_11), '购物车'),
     TabItem(@r(app.media.shop_tab_20), @r(app.media.shop_tab_21), '我的')
    ]
@State
var currenttabIndex:Int64 = 0

Stack(Alignment.Bottom) {
    Tabs(BarPosition.End, this.controller){
     TabContent(){
        home()
        }
        TabContent(){
            shopcar()
        }
        TabContent(){
            mine()
        }
    }
    .barHeight(60)
    .scrollable(false)
    .animationDuration(0)
    
     Row {
        ForEach(this.tabList, itemGeneratorFunc: {item: TabItem, index: Int64 =>
                    Column {
                        if(this.currenttabIndex == index){
                            Image(item.selectIcon).width(28).height(28)
                            Text(item.title).fontSize(15).fontColor(0xd84642).margin(top: 3)
                        }else {
                             Image(item.icon).width(28).height(28)
                            Text(item.title).fontSize(15).fontColor(Color.GRAY).margin(top: 3)
                         }
                    }
                .onClick({evet => this.currenttabIndex = index;this.controller.changeIndex(Int32(this.currenttabIndex))})
    })
}
.width(100.percent)
.height(60)
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.SpaceAround)
}

以上就是仓颉语言自定义tabbar的实现过程,感谢阅读。##HarmonyOS语言##仓颉##购物#

#harmonyos#
全部评论

相关推荐

06-23 22:33
上海大学 C++
如果你是即将毕业,并且普通而又迷茫的学生,看到我这个帖子,我最想对你说的话是:请务必再坚持一下,请抓住任何一个机会,哪怕机会渺茫,请再勇敢一点点,属于你的花儿只是开的慢一点。这也是我临床医学闺蜜去年找工作至暗时刻,我一遍遍打电话鼓励她的话。🖥&nbsp;我找工作经历:1。&nbsp;我是20-23年读研的,22年夏秋冬三季,疫情比较严重,我在写论文以及准备公务员考试,报了江苏,安徽,深圳,上海公务员,动不动就被隔离起来,结果是没考上,哈哈😃2。&nbsp;22年冬,开始emo,觉得自己咋学的这么菜,八股八股背不动,代码代码敲不动,后悔读书没再卷一卷,拿了平安银行计算机的offer,和比亚迪合肥的offer,但不是很满意,还在继续找啊找3。&nbsp;23年春天在海投,只要是国企,事业单位,管它有枣没枣,先敲一敲,然后上海事业编考试进面被刷了。时间点来到23年5月份,忙着毕业答辩,但工作还没敲定,我已经很emo,很疲惫了,怎么说呢,那个时候经常,上海,江苏,安徽三地往返,好几次在家,我妈看到我一个人在那哭,她说她很心疼我。那个时候感觉自己有点小抑郁了,有一种慢慢沉到湖里的感觉,充满着无法自救的无力和疲惫感。但我还在找工作的路上连滚带爬。。😄4。高中教师编。还是告诉自己不能放弃,23年2-6月还有一个老师的道路,因为本科学计算机和数学的,还拿了全国大学生数学竞赛奖也拿了高中数学教师资格证,于是冲上海高中数学教师招聘&nbsp;,拿到一个区重点高中数学教师offer。这个周期挺长的,还要现场笔试面试,教师🧑‍🏫不好当的。。5。23年春天还考了安徽电网,笔试第三,面试被刷了😄,同一时间线上还有几个银行的面试,合肥面完电网后火速去上海面各个银行。面完后,回重庆,在大家欢声笑语拍毕业照的时候,其实我很emo,因为我工作还没敲定。几天后,上帝给我打开了一扇窗,在宿舍四人集体去拍毕业照的早上,我的邮箱叮咣收到3条银行的offer,于是我有工作了,那个早上我的眼睛湿润了,那天拍照我也笑得很开心,只有我自己知道这一切来之不易。💡其他补充:年轻的时候,试错成本低,你一定会遇到挫折,请相信自己,再勇敢一点,再爬起来试试,你可以重头再来的!回想起来,22年6月-23年7月是我的至暗的低谷期,上一个黑暗时刻是一志愿没录取调剂学校,疯狂面试投简历,但那个时间持续比较短。也许以后我会遇到更艰难的事情,那个时候,希望我也能够爬起来继续向前。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务