鸿蒙应用开发从入门到入行 - 篇8:Tabs选项卡页签视图切换

简介: 在本篇文章里,您将掌握使用Tabs选项卡做栏目分类,这是未来应用开发中极为常用的组件

Tabs介绍

  • 你是否经常在移动端应用里见到如下菜单分类,例如下面两图

    image-20241206085145419

    image-20241206085448043

  • 像这样的不管是在上,还是在下的菜单分栏功能,在HarmonyOS应用开发中都是可以使用Tabs组件实现

  • 每当某个Tabs里的菜单切换后,页面内容也会跟着改变,如下图

    gif

  • 也即:Tabs组件可以在一个页面内快速实现视图内容的切换

  • 具体怎样使用呢?我们接着往下看

Tabs - 组件基本使用

  • 首先,Tabs里面只能放 TabContent子组件(放其他组件会报错),有多少个TabContent,就意味着有多少个切换视图。

gif

  • 如上图所示,这段代码里Tabs放了三个TabContent,因此有三个视图进行切换。但此时仅能实现左滑才能切换,根本没有显示出“导航栏”,所以一般情况下还会给TabContent设置tabBar属性,用来设置对应的导航栏

  • 如下代码,给每个TabContent都设置了tabBar属性

    @Entry
    @Component
    struct Index {
         
      build() {
         
        Tabs() {
         
          TabContent() {
         
            Text('1')
          }.tabBar('首页')
    
          TabContent() {
         
            Text('2')
          }.tabBar('联系人')
    
          TabContent() {
         
            Text('3')
          }.tabBar('我的')
        }
      }
    }
    
    AI 代码解读
  • 此时效果如下

    image-20241206092240968

  • 小结:

    1. Tabs里只能放TabContent
    2. TabContent有多少个就意味着有多少个视图切换
    3. TabContent配合tabBar属性,即可设置导航栏标题,tabBar传入字符串,字符串是什么,标题即为什么

修改导航栏位置到底部

  • 默认情况下,导航栏在页面上方,如果想把导航栏设置到页面底部显示,可以通过给Tabs传入参数barPosition来实现

  • 代码如下:

    Tabs({
          barPosition: BarPosition.End }) {
         
    
      // .... 省略里面的TabContent代码
    }
    
    AI 代码解读
  • 此时界面效果如下图

    image-20241206093101358

  • 如上代码所示:barPosition参数,需要传入BarPosition的枚举,这个枚举仅有两个值:Start与End,默认即为Start,代表在顶部,设置为End即为底部

修改导航栏位置到侧边

  • 那么是不是只有顶部、底部两种位置呢?其实不然,还可以设置左侧或右侧,这里需要用到Tabs的一个属性,即为:vertical

  • 这个属性代表:是否垂直摆放导航栏,那换句话说即为是否竖着放(也即侧边放),默认为false即水平摆放。

  • 我们试着把这个属性改为true,如下代码

    Tabs({
          barPosition: BarPosition.Start }) {
         
        // 省略里面的TabContent代码
      }
      .vertical(true)
      .barWidth(80)
      .barBackgroundColor('#f00')
    
    AI 代码解读
  • 效果如下图

    image-20241206093927822

  • 代码解释:

    • 因为vertical属性设置为true,必然是在侧边摆放导航栏,但为什么是左边呢?因为Tabs的barPosition参数设置为Start(默认值),即为在左侧,所以如果barPosition设置为BarPosition.End,即为在右侧。
    • barWidth是设置导航条的宽度(侧边方向是设置宽度)或高度(上下方向是设置高度)
    • barBackgroundColor是设置导航条背景颜色,这里加背景色主要是为了让大家能看到我们设置的宽度生效了
  • 小结:
    • 如果Tabs不设置vertical或者vertical设置为false,导航栏方向都是上下摆放,至于是上还是下跟barPosition有关,Start为上,End为下
    • 如果Tabs设置了vertical为true,导航栏方向都是侧边摆放,至于是左还是右跟barPosition有关,Start为左,End为右

Tabs嵌套使用

  • 很多时候我们的App应用场景其实需要顶部、底部都有导航栏,即整个App分为“首页”、“发现”、“推荐”
    、“我的”四个部分,但是在“首页”里,又分为:关注、视频、游戏、数码、科技四个板块,如下图所示

    img

  • 这时候就需要嵌套导航栏(在首页这个视图里再套一个Tabs),代码如下

    Tabs({
          barPosition: BarPosition.End }) {
         
        TabContent() {
         
          // 在首页这个视图里,又分为关注、视频、游戏、数码、科技四个切换分类
          Tabs() {
         
            TabContent() {
         
              Text('关注的内容')
            }.tabBar('关注')
    
            TabContent() {
         
              Text('视频的内容')
            }.tabBar('视频')
    
            TabContent() {
         
              Text('游戏的内容')
            }.tabBar('游戏')
    
            TabContent() {
         
              Text('数码的内容')
            }.tabBar('数码')
    
            TabContent() {
         
              Text('科技的内容')
            }.tabBar('科技')
          }
        }.tabBar('首页')
    
        TabContent() {
         
          Text('发现的内容')
        }.tabBar('发现')
    
        TabContent() {
         
          Text('推荐的内容')
        }.tabBar('推荐')
    
        TabContent() {
         
          Text('我的内容')
        }.tabBar('我的')
    }
    
    AI 代码解读

限制导航栏滚动

  • 默认情况下所有的Tabs的导航都具备滚动的功能,但是当我们使用Tabs嵌套时,如上面的场景,会发现底部的导航栏有滚动,首页里嵌套的导航栏也有滚动。为了避免他们冲突,一般我们会让底部的大导航栏禁止滚动。

  • 如何禁止滚动呢?

    • 使用scrollable属性,设置为false即可
  • Tabs({
          barPosition: BarPosition.End }) {
         
        TabContent() {
         
          // 在首页这个视图里,又分为关注、视频、游戏、数码、科技四个切换分类
          Tabs() {
         
            // 省略这个嵌套的代码
          }
        }.tabBar('首页')
    
        TabContent() {
         
          Text('发现的内容')
        }.tabBar('发现')
    
        TabContent() {
         
          Text('推荐的内容')
        }.tabBar('推荐')
    
        TabContent() {
         
          Text('我的内容')
        }.tabBar('我的')
    }
    .scrollable(false)
    
    AI 代码解读

自定义导航栏

  • 我们很多应用的底部导航栏,其实一般除了标题文字外,还会附带图标,例如下图

    img

  • 这时候需要我们使用@Builder装饰器自定义导航栏的布局后,再传递给tabBar

  • 如下代码

    tabBuilder(title: string, icon: ResourceStr) {
         
        Column({
          space: 2 }) {
         
          Image(icon)
            .width(30)
          Text(title)
        }
        .width('100%')
        .height(50)
        .justifyContent(FlexAlign.Center)
    }
    
    AI 代码解读
    • 这个Builder声明一个垂直布局的UI,上为图标,下为文字(标题),但此时这个Builder跟每个tabBar还没有任何关联,因此需要做调用绑定
  • 代码如下

    Tabs({
          barPosition: BarPosition.End }) {
         
        TabContent() {
         
          // ...
        }.tabBar(this.tabBuilder('首页', $r('app.media.ic_public_home')))
    
        TabContent() {
         
          // ...
        }.tabBar(this.tabBuilder('信息', $r('app.media.ic_public_comments')))
    
        TabContent() {
         
          // ...
        }.tabBar(this.tabBuilder('相册', $r('app.media.ic_public_albums')))
    
        TabContent() {
         
          // ...
        }.tabBar(this.tabBuilder('我的', $r('app.media.ic_public_contacts')))
    }
    
    AI 代码解读
  • 此时得到效果如下图

    image-20241206101841435

  • 我们会发现,不管点击哪一个,都不会有高亮效果。这是因为使用自定义导航栏后,需要自行在Builder里根据当前选中下标来判断显示不同的图标和颜色

  • 综上所述,我们应该先声明一个状态变量,记录当前选中的索引

    @State currentIndex: number = 0 // 默认为0,代表默认让第一个导航高亮
    
    AI 代码解读
  • 修改Builder,代码如下

    @Builder
    tabBuilder(title: string, icon: ResourceStr, selectIcon: ResourceStr, index: number) {
         
      Column({
          space: 2 }) {
         
        Image(this.currentIndex === index ? selectIcon : icon)
          .width(30)
          .fillColor(this.currentIndex === index ? '#0094ff' : '#000')
        Text(title)
          .fontColor(this.currentIndex === index ? '#0094ff' : '#000')
      }
      .width('100%')
      .height(50)
      .justifyContent(FlexAlign.Center)
    }
    
    AI 代码解读
  • 代码解释:

    • 首先参数上新增了selectIcon与index,分别代表选中时要显示的图片,以及当前的tabBar自身索引
    • 代码内根据我们记录的导航索引,与传入的当前tabBar自身索引做比较。相等就意味着当前tabBar被选中,所以让其使用选中的图片,以及设置选中的颜色。否则用默认的图片与颜色
  • 效果如下

    image-20241206102612263

切换指定页签

  • 此时我们发现,之前在不使用自定义导航栏时,默认的Tabs会实现切换逻辑,也即点谁谁高亮。但使用自定义导航栏后,发现点击导航栏没有切换高亮效果。

  • 原因:自定义导航栏是根据我们的自定义Builder来决定显示状态的,如果需要高亮随之改变,就需要把我们声明的记录索引的状态变量进行修改,也即上面声明的currentIndex。此时因为currentIndex一直是0,所以一直是第一个首页高亮。因此,我们需要页签改变时让currentIndex的值也跟着改变

  • 这是需要用到Tabs提供的onChange事件,监听索引变化,并将当前切换后的索引值赋值给currentIndex,代码如下

    Tabs({
          barPosition: BarPosition.End }) {
         
        // 省略中间代码
      }
      .onChange(index => {
         
        this.currentIndex = index
      })
    
    AI 代码解读
  • 以上利用onChange可以实现以外,其实在Next加入

    双向绑定后也能实现,做法是,只要将currentIndex与Tabs的index参数做双向绑定即可实现,代码如下 ```dart Tabs({ barPosition: BarPosition.End, index:
    this.currentIndex }) {
    // 省略里面内容
    }
    ```

  • 使用双向绑定还有个好处是:如果将来需要用代码改变页签,只需要改currentIndex的值即可,例如:this.currentIndex = 2即会切换到页签索引为2的导航

总结

  • 今日主要讲解了Tabs的使用,Tabs是一种视图切换的组件。

  • 默认情况下,Tabs是在顶部显示,如果要改位置可以通过barPosition参数来修改

  • 如果需要展示在侧边,可以通过 vertical 属性设置为true来实现

  • 如果需要带图带标题的自定义导航栏,可以用@Builder进行封装并传入tabBar

课后练习

  • 判断题
    • 当设置vertical为true时,导航栏在右侧显示
    • 当Tabs的barPosition为End,vertical为false时,导航栏在右侧显示
  • 简单题
    • 请回答,直接设置Tabs的vertical为true,导航栏在哪显示?

预告:下一篇内容

  • 下一篇将做个鸿蒙官网的经典案例:新闻数据,即本页一开始的图如下,敬请期待

image-20241206085145419

目录
打赏
0
7
7
0
40
分享
相关文章
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
原生鸿蒙版小艺APP成功接入DeepSeek-R1,为HarmonyOS用户带来更智能高效的交互体验。通过此次升级,用户在编程、学习和工作中的问题可迅速获得专业解答。同时,此举为HarmonyOS应用开发者提供了新的技术参考,激发了更多创新应用场景的开发,助力打造差异化竞争优势,推动HarmonyOS生态繁荣发展。
198 68
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
HarmonyOS鸿蒙应用开发——探索原生与H5通信框架DSBridge
HarmonyOS版DSBridge是一个桥梁库,允许鸿蒙原生环境与JavaScript交互。它兼容Android和iOS的第三方DSBridge核心功能,支持同步和异步调用、命名空间API管理、进度回调及页面关闭监听等功能。主要特性包括适配鸿蒙NEXT版本、支持串行异步并发任务、兼容DSBridge 2.0与3.0版本JS脚本,并提供类形式集中管理API及自定义页面组件注册。源码仓库:HarmonyOS版 - DSBridge-HarmonyOS。安装命令为`ohpm install @hzw/ohos-dsbridge`。通过该库,开发者可以方便地在鸿蒙系统中实现原生与JS的高效交互。
206 1
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
33 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
52 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
34 2
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
51 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
3月前
|
自学记录鸿蒙API 13:PreviewKit从文件预览到应用开发
通过学习API 13,我深入研究了**PreviewKit(文件预览服务)**。该模块支持快速预览多种文件类型(文本、图片、视频、音频、PDF等),为文件管理类应用提供系统级支持。本文分享了从搭建开发环境到实现单文件和多文件预览的全过程,并介绍了如何构建一个实用的文件预览助手应用。通过实践,不仅掌握了技术细节,还提升了个人开发能力。希望这些经验能为其他开发者带来启发与帮助。
67 10
自学记录鸿蒙API 13:PreviewKit从文件预览到应用开发
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
101 8
|
2天前
鸿蒙开发:熟知@BuilderParam装饰器
在实际的开发中,我们经常会遇到自定义组件的情况,比如通用的列表组件,选项卡组件等等,由于使用方的样式不一,子组件是动态变化的,针对这一情况,就不得不让使用方把子组件视图传递过来,如何来接收这个UI视图,这就是@BuilderParam装饰器的作用。
鸿蒙开发:熟知@BuilderParam装饰器
鸿蒙开发:V2版本装饰器之@Monitor装饰器
如果要实现@Monitor监听,其变量一定要被@Local、@Param、@Provider、@Consumer、@Computed装饰,未被修饰则无法被监听,还有,如果监听对象的变化,则不建议在一个类中对同一个属性进行多次@Monitor的监听,多次监听,只有最后一个定义的监听方法才会有效。

热门文章

最新文章

  • 1
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
    19
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    19
  • 3
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    15
  • 4
    EMAS 性能分析全面适配HarmonyOS NEXT,开启原生应用性能优化新纪元
    8
  • 5
    鸿蒙开发:了解@Builder装饰器
    9
  • 6
    【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    14
  • 7
    【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
    11
  • 8
    HarmonyOS使用系统图标
    6
  • 9
    【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    6
  • 10
    一文彻底搞清楚HarmonyOS元服务
    22
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等