Kotlin Jetpack Compose - 实现Tab布局

news2024/11/24 1:06:36

        Tab布局是一种常见的UI设计,它允许用户在不同的视图或数据集之间切换。我们将使用Jetpack Compose的 TabRowScrollableTabRow 组件来实现这个布局。

一、基本的Tab布局——TabRow

二、滚动的Tab布局——ScrollableTabRow 组件

三、自定义Tab组件


一、基本的Tab布局——TabRow

在Jetpack Compose中,我们可以使用 TabRow 组件创建一个Tab布局。以下是一个简单的例子:

@Preview
@Composable
fun  BasicTabExample(){
    val titles=listOf("Tab1","Tab2","Tab3")
    var tabIndex by remember {
        mutableStateOf(1)
    }

    Column(modifier = Modifier.fillMaxSize()
        .background(
        brush = SolidColor(Color.Gray),
    )){
        TabRow(selectedTabIndex = tabIndex, backgroundColor = Color.Green, contentColor = Color.Red){
            titles.forEachIndexed { index,title ->
                Tab(text ={
                          Text(text = title)
                }, selected = tabIndex == index, onClick = {
                    tabIndex =index
                })
            }
        }

        when (tabIndex) {
            0 ->{
                Text(text = "Tab111")
            }
            1->{
                Text(text = "Tab211")
            }
            2 ->{
                Text(text = "Tab311")
            }
        }

    }
}

在这个例子中,我们创建了一个包含三个Tab的 TabRow。我们使用 remember { mutableStateOf(0) } 创建一个可记忆的状态来跟踪当前选中的Tab。每个Tab的点击事件中,我们更新 tabIndex 为该Tab的索引。在 TabRow 下面,我们根据 tabIndex 的值来显示相应的Tab内容。

二、滚动的Tab布局——ScrollableTabRow 组件

如果你有很多的Tab,你可能希望它们可以滚动,而不是全部挤在一起。在这种情况下,你可以使用 ScrollableTabRow 组件。以下是一个例子:

@Preview
@Composable
fun ScrollableTabExample(){
    val titles= listOf("Tab1","Tab2","Tab3","Tab4","Tab5","Tab6", "Tab7", "Tab8", "Tab9", "Tab10","Tab1","Tab2","Tab3","Tab4","Tab5","Tab6", "Tab7", "Tab8", "Tab9", "Tab10")
    var tabIndex by remember {
        mutableStateOf(5)
    }
    Column() {
        ScrollableTabRow(selectedTabIndex = tabIndex){
            titles.forEachIndexed { index, title -> 
                Tab(text ={
                          Text(text = title)
                }, selected = tabIndex==index, onClick = { 
                    tabIndex=index
                })
            }
        }
        when(tabIndex){
            tabIndex-> Text(text = "Tab${tabIndex+1}")
        }
    }
    
}

 

这个例子跟上一个基本相同,只是我们使用了 ScrollableTabRow 而不是 TabRow。这使得当Tab太多无法全部显示在屏幕上时,用户可以滚动Tab列表来查看和选择更多的Tab。

三、自定义Tab组件

在Jetpack Compose中,我们可以创建自定义的Tab组件,以适应不同的需求和设计。

下面是一个示例,我们将创建一个带有自定义背景和图标的Tab组件:

@Preview
@Composable
fun CustomTabExample(){
    val titles =listOf("Home","Search","Profile","my")
    var tabIndex by remember{ mutableStateOf(0)}

    TabRow(selectedTabIndex = tabIndex, backgroundColor = Color.White){
        titles.forEachIndexed { index, title ->
            Tab(selected = tabIndex == index, onClick = {
                tabIndex=index
            }
            ) {
                CustomTabContent(title,selected = tabIndex == index)
            }
        }
    }
}

@Composable
fun CustomTabContent(title:String ,selected:Boolean){
    val background = if(selected) Color.Cyan else Color.Yellow
    val icon =when(title){
        "Home" -> Icons.Default.Home
        "Search" -> Icons.Default.Search
        "Profile"-> Icons.Default.Person
        else -> Icons.Default.Build
    }

    Column(horizontalAlignment = Alignment.CenterHorizontally,
    verticalArrangement = Arrangement.Center,
    modifier = Modifier
        .background(background)
        .padding(16.dp)) {
        Icon(imageVector = icon, contentDescription = null)
        Text(text = title, color = if(selected) Color.Blue else Color.Green)
    }
}

通过Jetpack Compose,我们可以方便地创建出美观的,响应式的Tab布局。在你的应用中试试吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频数据处理-H265/HEVC视频码流分析

一、H265概述 H265/HEVC(Hight Efficiency Video Coding)是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准,主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行…

chatgpt赋能python:Python自动化定位元素的方法详解

Python自动化定位元素的方法详解 作为一名Python编程经验丰富的工程师,我经常需要用到自动化定位元素的方法。今天,我想与大家分享一下在Python中如何自动化定位元素,以帮助那些想要进行Web自动化测试的开发者们。 什么是自动化定位元素 在…

chatgpt赋能python:Python聊天界面:开发高效且易于使用的消息应用

Python聊天界面:开发高效且易于使用的消息应用 Python是一种十分流行的编程语言,最近几年来,这种语言在GUI应用程序开发方面也越来越受欢迎。在本篇文章中,我们将介绍如何使用Python开发一个高效且易于使用的消息应用程序——聊天…

chatgpt赋能python:Python自动化定位——解放SEO员工的双手

Python自动化定位——解放SEO员工的双手 SEO(Search Engine Optimization)是现代数字营销中必不可少的一环。面对庞大的网络世界,SEO员工们日复一日地进行着关键词排名、页面跳转、链接检测等重复且繁琐的工作。而Python作为一种功能强大、易…

chatgpt赋能python:Python自动执行:提高效率,增强灵活性

Python自动执行: 提高效率,增强灵活性 随着时代进步,人们日常生活中越来越依赖计算机和网络技术,而在编程领域,Python语言作为一种高效、可读性好、易学易用的语言,得到了广泛应用。其中,Pytho…

【算法之栈与队列I】leetcode239. 滑动窗口最大值

232.用栈实现队列 力扣题目链接 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并…

使用netwox 的实例进行ARP地址解析协议分析【网络工程】(保姆级图文)

目录 1. netwox 构造 ARP 报文使用 netwox 工具构造 ARP 包。1) 查看 netwox 所在主机默认的 ARP 包的相关信息,执行命令如下:2) 构造 ARP 请求包,请求目标主机 192.168.43.95,执行命令如下:3) 为了验证构造的 ARP 请求…

IDEA(2021.3.3) 登录Github copilot最新版本报错解决

"Request sign ln Initiate failed with message:read ECONNRESET, request id: 6, error code:-32603 " .在获得github认证后的登录设备验证阶段弹出。此处应该为login 弹出异常,方法一:先使用Github 520进行动态替换,打开自己hos…

霍夫变换椭圆检测(matlab仿真与图像处理系列第2期)

概述 椭圆检测是图像处理中的一个重要问题,其目的是从图像中检测出可能存在的椭圆。在实际的应用中,椭圆常常被用来描述物体的形状或者得到物体的尺寸信息。 传统的椭圆检测方法通常采用二维Hough变换,在求解过程中需要处理大量的数据,并且计算复杂度高,导致速度较慢,…

linux系统grep文本三剑客之一

文章目录 一、grep常用选项二、正则表达式三、sort命令四、tr命令五、cut命令六、split命令七、paste命令八、正则表达式总结 一、grep常用选项 grep:文本三剑客之一,对文本内容进行过滤,支持正则表达式,针对行来进行处理。 -m&a…

【C++】 Qt-信号与槽

文章目录 基本概念添加信号与槽方法一方法二 自定义信号与槽CheckBox自定义QMessageBox自定义信号 信号与槽多对多一个信号连接多个槽多个信号连接一个槽一个信号连接一个信号连接一个槽 断开连接方法一方法二判断是否连接成功 基本概念 信号(signal)和…

chatgpt赋能python:Python自动执行函数——提高生产力的利器

Python自动执行函数 —— 提高生产力的利器 Python作为一种高级编程语言,具有强大的自动化能力,可以轻松实现多种任务的自动执行,从而提高生产力和效率。这篇文章将介绍如何使用Python自动执行函数,以及它对于SEO的重要意义。 什…

Flutter Dart类

目录 类 构造函数 命名构造函数 重定向构造函数 常量构造函数 工厂构造函数 Getters 和 Setters 初始化列表 可覆写的操作符 类 创建一个dart文件,名称全小写,里面的类可以按照驼峰命名法。文件名和类名可以不保持统一,这个跟Java有明…

Scrapy: 一个强大的 Python 爬虫框架--介绍--下载--启动!!

目录 Scrapy 影响力 介绍 主要特点 架构 运行流程 基本使用 安装 创建 Scrapy 项目 创建爬虫 爬虫包含的内容 运行爬虫 Scrapy 影响力 作为目前爬虫主流框架之一,Scrapy的影响力和应用范围非常广泛: 根据GitHub上的数据,Scrapy是一…

ERR! code ERR_SOCKET_TIMEOUT

问题 安装npm包,终端报错ERR! code ERR_SOCKET_TIMEOUT ERR! code ERR_SOCKET_TIMEOUT详细问题 笔者运行以下命令重新安装依赖项: npm install控制台报错,具体报错信息如下 npm ERR! code ERR_SOCKET_TIMEOUT npm ERR! network Socket t…

【C++】【VLD】VLD检测内存泄漏

【C】【VLD】VLD检测内存泄漏 C/C 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。 然而不管内存…

计算机网络——传输层

序言 计算机网络中的传输层在当今的社会起到了什么作用? 计算机网络中的传输层在通信和数据传输方面起着至关重要的作用。传输层是计算机网络体系结构中的一层,它负责提供端到端的可靠数据传输和通信服务;有着以下几个方面作用:可…

3-css高级特效-2

01-空间转换 空间转换简介 空间:是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间,Z 轴位置与视线方向相同。空间转换也叫 3D转换属性:transform 平移 transform: translate3d(x, y, z); transform: translateX(); transfor…

chatgpt赋能python:Python聊天机器人程序:把智能带入聊天

Python聊天机器人程序:把智能带入聊天 在数字化时代,机器人指引和客户服务变得越来越流行。为了快速而有效地满足这种需求,聊天机器人被广泛研究与开发。Python是在这方面一个非常受欢迎的编程语言,能够快速地构建聊天机器人。在…

【C++】win 10 / win 11:Visual Studio 2022 社区版免费下载与安装

目录 一、Visual Studio 2022 下载 二、Visual Studio 2022 安装 三、Visual Studio 2022 快捷方式创建 四、Visual Studio 2022 使用 一、Visual Studio 2022 下载 Visual Studio 2022 官方下载https://visualstudio.microsoft.com/zh-hans/downloads/首先登陆 Visual Stu…