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布局。在你的应用中试试吧!

GitHub 加速计划 / compose / compose
33.28 K
5.15 K
下载
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。
最近提交(Master分支:3 个月前 )
43ac1e31 Signed-off-by: Trevor Foster <trevorfoster19@gmail.com> 1 天前
5561a778 full diff: https://github.com/docker/cli/compare/8d1bacae3e49...v27.4.0-rc.2 Signed-off-by: Sebastiaan van Stijn <github@gone.nl> 6 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐