Kotlin Jetpack Compose - 实现Tab布局

        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.Yellowval icon =when(title){"Home" -> Icons.Default.Home"Search" -> Icons.Default.Search"Profile"-> Icons.Default.Personelse -> 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.hqwc.cn/news/2270.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

appium如何连接多台设备

目录 前言: 1.我们拿两台设备来模拟操作下,使用:adb devices查看连接状况,获取到设备名称。 2.获取需要操作app的包名和页面名称(前提该设备已经打开了app) 3.设置初始配置信息 4.打开页面后操作元素&am…

Spring MVC相关注解运用 —— 上篇

目录 一、Controller、RequestMapping 1.1 示例程序 1.2 测试结果 二、RequestParam 2.1 示例程序 2.2 测试结果 三、RequestHeader、CookieValue 3.1 示例程序 3.2 测试结果 四、SessionAttributes 4.1 示例程序 4.2 测试结果 五、ModelAttribute 5.1 示例程序 …

A核与M核异构通信过程解析

现在越来越多的产品具有M core和A core的异构架构,既能达到M核的实时要求,又能满足A核的生态和算力。比如NXP的i.MX8系列、瑞萨的RZ/G2L系列以及TI的AM62x系列等等。虽然这些处理器的品牌及性能有所不同,但多核通信原理基本一致,都…

Spring Boot中的SimpMessagingTemplate是什么,原理,以及如何使用

Spring Boot中的SimpMessagingTemplate是什么,原理,以及如何使用 SimpMessagingTemplate是Spring Framework中的一个类,用于向WebSocket客户端发送消息。在Spring Boot应用程序中,可以使用SimpMessagingTemplate来实现WebSocket通…

OpenCV 学习笔记(C++)(1.4W字)

一切图像皆Mat OpenCV中图像对象的创建与复制 Mat基本结构 Mat对象数据组成:头部和数据部分,头部存储图像的属性(大小、宽高、图像类型:浮点数类型、字节类型、16位整型、32位整型、双精度浮点型,通道数量和获取途径…

【微服务】什么是微服务?-- 全面了解微服务架构

What is Microservices — Edureka 您有没有想过,什么是微服务以及扩展行业如何与它们集成,同时构建应用程序以满足客户的期望? 要了解什么是微服务,您必须了解如何将单体应用程序分解为独立打包和部署的小型微型应用程序。本文将…

在windows server上用Mosquitto软件创建MQTT服务器

今天下午捣鼓了半天,在云服务器上面创建了个MQTT服务器,然后用MQTTX软件进行了测试。过程记录如下: 1、下载mosquitto软件,链接如下图: 2、下载完成后安装,一直点下一步下一步就好了。 3、在安装路径下&am…

CHATGPT使用笔记

CHATGPT是帮你做事,而不是替你做事 1、联网插件: 使用Webpilot插件联网时还可以同时使用其它两种插件(一次可以同时使用三个插件),而使用Web Browsing插件功能联网时无法使用插件功能(联网功能和插件只能…

Celery分布式异步框架

Celery异步任务框架 """ 1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket) 2)celery服务为为其他项目服务提供异步解决任务需求的 注:会有两个服务同时运行,一个是项目服务&a…

基于SpringCloud微服务流动资金贷款业务系统设计与实现

一、引言 由于传统的贷款业务系统并不能够顺应时代的变化,同时在一定程度上对业务发展进行了限制,所以为了适应时代的发展,信息贷款业务应该能够被产品化、丰富化,同时还需要制定一套特定的流程来满足新时代用户的需求。流程化的规范管理是当今银行业务发展的必然趋势,研究并开…

Linux--获取一长串目录的结构指令:tree

注意:这个tree指令不是Linux自带的,需要下载 yum install -y tree (-y的作用是免确定) 示例:

风景类Midjourney prompt提示词

稳定输出优美风景壁纸的Midjourney prompt提示词。 1\在夏夜,有淡蓝色的星空,海边,流星,烟花,海滩上全是蓝色的玫瑰和绿色的植物,由Ivan Aivazovsky和Dan Mumford,趋势在cgsociety,…