news 2026/4/24 16:19:25

Android Jetpack Compose - TopAppBar、BottomAppBar、Scaffold

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android Jetpack Compose - TopAppBar、BottomAppBar、Scaffold

一、TopAppBar

1、基本介绍
  • TopAppBar 用于实现顶部的应用栏,它封装了顶部的应用栏的常见样式和交互,例如,标题、导航图标、操作按钮、滚动联动
参数说明
title显示在应用栏中的文字
navigationIcon用于导航的主图标,显示在应用栏的左侧
actions可让用户访问关键操作的图标,它们显示在应用栏的右侧
scrollBehavior确定顶部应用栏如何响应容器内部内容的滚动
colors确定应用栏的显示方式
2、演示
TopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={Text("顶部的应用栏")})
TopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),navigationIcon={IconButton(onClick={}){Icon(imageVector=Icons.AutoMirrored.Filled.ArrowBack,contentDescription="返回")}},actions={IconButton(onClick={}){Icon(imageVector=Icons.Filled.Menu,contentDescription="菜单")}},title={Text("顶部的应用栏")})
valscrollBehavior=TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())Column(modifier=Modifier.fillMaxSize()){TopAppBar(title={Text("顶部的应用栏")},scrollBehavior=scrollBehavior)LazyColumn(modifier=Modifier.fillMaxSize().nestedScroll(scrollBehavior.nestedScrollConnection),contentPadding=PaddingValues(top=8.dp)){items(50){Text("列表项${it+1}",modifier=Modifier.padding(16.dp))}}}
3、其他顶部应用栏
  1. 居中对齐顶部应用栏
valscrollBehavior=TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())Column(modifier=Modifier.fillMaxSize()){CenterAlignedTopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),navigationIcon={IconButton(onClick={}){Icon(imageVector=Icons.AutoMirrored.Filled.ArrowBack,contentDescription="返回")}},actions={IconButton(onClick={}){Icon(imageVector=Icons.Filled.Menu,contentDescription="菜单")}},title={Text("顶部的应用栏")},scrollBehavior=scrollBehavior)LazyColumn(modifier=Modifier.fillMaxSize().nestedScroll(scrollBehavior.nestedScrollConnection),contentPadding=PaddingValues(top=8.dp)){items(50){Text("列表项${it+1}",modifier=Modifier.padding(16.dp))}}}
  1. 中等顶部应用栏
MediumTopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={Text("顶部的应用栏")})
  1. 大顶部应用栏
LargeTopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={Text("顶部的应用栏")})

二、BottomAppBar

1、基本介绍
  • BottomAppBar 用于实现底部的应用栏,它封装了底部的应用栏的常见样式和交互,例如,操作按钮、浮动操作按钮
2、演示
  1. BottomAppBar 基本使用,BottomAppBar 默认不会固定在底部
BottomAppBar(actions={IconButton(onClick={}){Icon(Icons.Filled.Check,contentDescription="Check")}IconButton(onClick={}){Icon(Icons.Filled.Edit,contentDescription="Edit",)}IconButton(onClick={}){Icon(Icons.Filled.ThumbUp,contentDescription="ThumbUp",)}IconButton(onClick={}){Icon(Icons.Filled.MailOutline,contentDescription="MailOutline",)}},floatingActionButton={FloatingActionButton(onClick={},containerColor=BottomAppBarDefaults.bottomAppBarFabColor,elevation=FloatingActionButtonDefaults.bottomAppBarFabElevation()){Icon(Icons.Filled.Add,"Add")}})
  1. BottomAppBar 固定在底部实现
ConstraintLayout(modifier=Modifier.fillMaxSize()){val(content,bottomBar)=createRefs()// 填满剩余空间LazyColumn(modifier=Modifier.constrainAs(content){top.linkTo(parent.top)start.linkTo(parent.start)end.linkTo(parent.end)bottom.linkTo(bottomBar.top)width=Dimension.fillToConstraints height=Dimension.fillToConstraints}.fillMaxWidth()){items(50){index->Text(text="Item${index+1}",modifier=Modifier.fillMaxWidth().padding(16.dp))}}BottomAppBar(modifier=Modifier.constrainAs(bottomBar){bottom.linkTo(parent.bottom)start.linkTo(parent.start)end.linkTo(parent.end)},actions={IconButton(onClick={}){Icon(Icons.Filled.Check,contentDescription="Check")}IconButton(onClick={}){Icon(Icons.Filled.Edit,contentDescription="Edit",)}IconButton(onClick={}){Icon(Icons.Filled.ThumbUp,contentDescription="ThumbUp",)}IconButton(onClick={}){Icon(Icons.Filled.MailOutline,contentDescription="MailOutline",)}},floatingActionButton={FloatingActionButton(onClick={},containerColor=BottomAppBarDefaults.bottomAppBarFabColor,elevation=FloatingActionButtonDefaults.bottomAppBarFabElevation()){Icon(Icons.Filled.Add,"Add")}})}

三、Scaffold

1、基本介绍
  • Scaffold 是 Compose 中用于构建标准化的页面结构的脚手架组件
@ComposablefunScaffold(modifier:Modifier=Modifier,topBar:@Composable()->Unit={},bottomBar:@Composable()->Unit={},snackbarHost:@Composable()->Unit={},floatingActionButton:@Composable()->Unit={},floatingActionButtonPosition:FabPosition=FabPosition.End,containerColor:Color=MaterialTheme.colorScheme.background,contentColor:Color=contentColorFor(containerColor),contentWindowInsets:WindowInsets=ScaffoldDefaults.contentWindowInsets,content:@Composable(PaddingValues)->Unit)
参数说明
modifier整体修饰符
topBar顶部栏
bottomBar底部栏
snackbarHostSnackbar 的组件
floatingActionButton浮动按钮
floatingActionButtonPosition浮动按钮位置
containerColor容器背景色
contentColor内容文字色
contentWindowInsets窗口边距
content主要内容区域
2、基本使用
varpressesbyremember{mutableIntStateOf(0)}Scaffold(topBar={TopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={Text("顶部应用栏")})},bottomBar={BottomAppBar(containerColor=MaterialTheme.colorScheme.primaryContainer,contentColor=MaterialTheme.colorScheme.primary,){Text(modifier=Modifier.fillMaxWidth(),textAlign=TextAlign.Center,text="底部应用栏",)}},floatingActionButton={FloatingActionButton(onClick={presses++}){Icon(Icons.Default.Add,contentDescription="添加")}}){innerPadding->Column(modifier=Modifier.padding(innerPadding),){Text("点击了$presses次")}}
3、使用 floatingActionButtonPosition
(1)基本介绍
  • FabPosition 是用于控制 Scaffold 中 FloatingActionButton(FAB)位置的枚举类
枚举值说明
End屏幕右下角
Center屏幕底部正中央
Start屏幕左下角
EndOverlay屏幕右下角,悬浮在 BottomAppBar 上方
(2)演示
varpressesbyremember{mutableIntStateOf(0)}Scaffold(topBar={TopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={Text("顶部应用栏")})},bottomBar={BottomAppBar(containerColor=MaterialTheme.colorScheme.primaryContainer,contentColor=MaterialTheme.colorScheme.primary,){Text(modifier=Modifier.fillMaxWidth(),textAlign=TextAlign.Center,text="底部应用栏",)}},floatingActionButton={FloatingActionButton(onClick={presses++}){Icon(Icons.Default.Add,contentDescription="添加")}},floatingActionButtonPosition=FabPosition.EndOverlay){innerPadding->Column(modifier=Modifier.padding(innerPadding),){Text("点击了$presses次")}}
4、关于 innerPadding
(1)基本介绍
  • innerPadding 是 Scaffold 自动计算并传递给主要内容区域的安全边距值,它确保内容不会被 Scaffold 的其他部分遮挡,例如,顶部栏、底部栏
(2)演示
  • 不使用 innerPadding,顶部内容会被顶部栏遮挡,底部内容会被底部栏遮挡
varpressesbyremember{mutableIntStateOf(0)}Scaffold(topBar={TopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={Text("顶部应用栏")})},bottomBar={BottomAppBar(containerColor=MaterialTheme.colorScheme.primaryContainer,contentColor=MaterialTheme.colorScheme.primary,){Text(modifier=Modifier.fillMaxWidth(),textAlign=TextAlign.Center,text="底部应用栏",)}},floatingActionButton={FloatingActionButton(onClick={presses++}){Icon(Icons.Default.Add,contentDescription="添加")}}){innerPadding->Column(modifier=Modifier.fillMaxSize()){LazyColumn(modifier=Modifier.fillMaxSize()){items(50){Text("列表项${it+1}",modifier=Modifier.padding(16.dp))}}}}
5、使用 snackbarHost
varpressesbyremember{mutableIntStateOf(0)}valscope=rememberCoroutineScope()valsnackbarHostState=remember{SnackbarHostState()}Scaffold(topBar={TopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={Text("顶部应用栏")})},bottomBar={BottomAppBar(containerColor=MaterialTheme.colorScheme.primaryContainer,contentColor=MaterialTheme.colorScheme.primary,){Text(modifier=Modifier.fillMaxWidth(),textAlign=TextAlign.Center,text="底部应用栏",)}},snackbarHost={SnackbarHost(hostState=snackbarHostState)},floatingActionButton={FloatingActionButton(onClick={scope.launch{presses++valresult=snackbarHostState.showSnackbar(message="点击了$presses次",actionLabel="撤销",duration=SnackbarDuration.Short)if(result==SnackbarResult.ActionPerformed){presses--}}}){Icon(Icons.Default.Add,contentDescription="添加")}}){innerPadding->Column(modifier=Modifier.padding(innerPadding),){Text("点击了$presses次")}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 8:04:44

Cursor VIP完整配置指南:从零开始掌握AI编程助手

Cursor VIP完整配置指南:从零开始掌握AI编程助手 【免费下载链接】cursor-vip cursor IDE enjoy VIP 项目地址: https://gitcode.com/gh_mirrors/cu/cursor-vip 还在为无法使用Cursor IDE的高级功能而苦恼吗?现在,通过cursor-vip项目&…

作者头像 李华
网站建设 2026/4/23 10:41:03

2026毕设ssm+vue家政服务管理平台论文+程序

本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景 关于家政服务信息化问题的研究,现有研究主要以平台商业模式、线下服务标准化及用户满意度调查为主,专…

作者头像 李华
网站建设 2026/4/17 23:44:07

地址数据治理实战:结合MGeo的自动化清洗工作流

地址数据治理实战:结合MGeo的自动化清洗工作流 在保险公司数字化改革过程中,核心系统的客户地址数据往往存在大量不规范问题。据统计,某保险公司发现其系统中40%的地址数据需要清洗,手动处理需要6个月,但监管要求3个月…

作者头像 李华
网站建设 2026/4/23 16:28:05

社区团购效率革命:团长地址智能匹配的1小时上线指南

社区团购效率革命:团长地址智能匹配的1小时上线指南 社区团购运营中,20%的订单错误源于团长地址填写不规范。技术资源紧张的情况下,如何快速上线一个最小可行方案?本文将介绍如何利用AI模型快速解决地址匹配问题。 问题背景与技术…

作者头像 李华
网站建设 2026/4/23 17:27:55

极简主义LaTeX学术论文模板终极指南:3分钟快速上手

极简主义LaTeX学术论文模板终极指南:3分钟快速上手 【免费下载链接】latex-paper Minimalist LaTeX template for academic papers 项目地址: https://gitcode.com/gh_mirrors/la/latex-paper 还在为学术论文排版而烦恼吗?🤔 这个极简…

作者头像 李华
网站建设 2026/4/20 9:00:15

终极Python GUI设计工具:零基础也能快速创建专业界面

终极Python GUI设计工具:零基础也能快速创建专业界面 【免费下载链接】tkinter-helper 为tkinter打造的可视化拖拽布局界面设计小工具 项目地址: https://gitcode.com/gh_mirrors/tk/tkinter-helper 还在为Python界面设计发愁吗?每次写Tkinter代码…

作者头像 李华