news 2026/5/5 0:13:42

Android Jetpack Compose - ModalNavigationDrawer、NavigationRail、PullToRefreshBox

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android Jetpack Compose - ModalNavigationDrawer、NavigationRail、PullToRefreshBox

一、ModalNavigationDrawer(抽屉式导航栏)

  1. 使用 drawerContent,提供 ModalDrawerSheet(提供抽屉式导航栏的内容)。可以通过从侧边滑动或点击按钮来打开抽屉式导航栏
varselectedItemIndexbyremember{mutableStateOf(0)}ModalNavigationDrawer(drawerContent={ModalDrawerSheet{Text("抽屉式导航栏",modifier=Modifier.padding(16.dp))HorizontalDivider()NavigationDrawerItem(icon={Icon(Icons.Filled.Home,contentDescription=null)},label={Text("Home")},selected=selectedItemIndex==0,onClick={selectedItemIndex=0})NavigationDrawerItem(icon={Icon(Icons.Filled.Call,contentDescription=null)},label={Text("Call")},selected=selectedItemIndex==1,onClick={selectedItemIndex=1})NavigationDrawerItem(icon={Icon(Icons.Filled.Email,contentDescription=null)},label={Text("Email")},selected=selectedItemIndex==2,onClick={selectedItemIndex=2})NavigationDrawerItem(icon={Icon(Icons.Filled.Person,contentDescription=null)},label={Text("Person")},selected=selectedItemIndex==3,onClick={selectedItemIndex=3})}}){}
  1. 控制抽屉式导航栏的打开和关闭,使用 DrawerState,它提供了 open 与 close 方法
varselectedItemIndexbyremember{mutableStateOf(0)}valdrawerState=rememberDrawerState(initialValue=DrawerValue.Closed)valscope=rememberCoroutineScope()ModalNavigationDrawer(drawerState=drawerState,drawerContent={ModalDrawerSheet{Text("抽屉式导航栏",modifier=Modifier.padding(16.dp))HorizontalDivider()NavigationDrawerItem(icon={Icon(Icons.Filled.Home,contentDescription=null)},label={Text("Home")},selected=selectedItemIndex==0,onClick={selectedItemIndex=0scope.launch{drawerState.close()}})NavigationDrawerItem(icon={Icon(Icons.Filled.Call,contentDescription=null)},label={Text("Call")},selected=selectedItemIndex==1,onClick={selectedItemIndex=1scope.launch{drawerState.close()}})NavigationDrawerItem(icon={Icon(Icons.Filled.Email,contentDescription=null)},label={Text("Email")},selected=selectedItemIndex==2,onClick={selectedItemIndex=2scope.launch{drawerState.close()}})NavigationDrawerItem(icon={Icon(Icons.Filled.Person,contentDescription=null)},label={Text("Person")},selected=selectedItemIndex==3,onClick={selectedItemIndex=3scope.launch{drawerState.close()}})}}){Box(modifier=Modifier.fillMaxSize(),contentAlignment=Alignment.Center,){Button(onClick={scope.launch{drawerState.open()}}){Text("打开抽屉式导航栏")}}}
varselectedItemIndexbyremember{mutableStateOf(0)}valdrawerState=rememberDrawerState(initialValue=DrawerValue.Closed)valscope=rememberCoroutineScope()ModalNavigationDrawer(drawerState=drawerState,gesturesEnabled=false,drawerContent={ModalDrawerSheet{Text("抽屉式导航栏",modifier=Modifier.padding(16.dp))HorizontalDivider()NavigationDrawerItem(icon={Icon(Icons.Filled.Home,contentDescription=null)},label={Text("Home")},selected=selectedItemIndex==0,onClick={selectedItemIndex=0scope.launch{drawerState.close()}})NavigationDrawerItem(icon={Icon(Icons.Filled.Call,contentDescription=null)},label={Text("Call")},selected=selectedItemIndex==1,onClick={selectedItemIndex=1scope.launch{drawerState.close()}})NavigationDrawerItem(icon={Icon(Icons.Filled.Email,contentDescription=null)},label={Text("Email")},selected=selectedItemIndex==2,onClick={selectedItemIndex=2scope.launch{drawerState.close()}})NavigationDrawerItem(icon={Icon(Icons.Filled.Person,contentDescription=null)},label={Text("Person")},selected=selectedItemIndex==3,onClick={selectedItemIndex=3scope.launch{drawerState.close()}})}}){Scaffold(topBar={TopAppBar(colors=topAppBarColors(containerColor=MaterialTheme.colorScheme.primaryContainer,titleContentColor=MaterialTheme.colorScheme.primary,),title={IconButton(onClick={scope.launch{drawerState.open()}}){Icon(Icons.Default.MoreVert,contentDescription="MoreVert")}})},){innerPadding->Column(modifier=Modifier.fillMaxSize().padding(innerPadding),horizontalAlignment=Alignment.CenterHorizontally,verticalArrangement=Arrangement.Center,){Text("内容区域")}}}

二、NavigationRail(侧边导航栏)

varselectedItemIndexbyremember{mutableStateOf(0)}NavigationRail{NavigationRailItem(icon={Icon(Icons.Filled.Home,contentDescription=null)},label={Text("Home")},selected=selectedItemIndex==0,onClick={selectedItemIndex=0})NavigationRailItem(icon={Icon(Icons.Filled.Call,contentDescription=null)},label={Text("Call")},selected=selectedItemIndex==1,onClick={selectedItemIndex=1})NavigationRailItem(icon={Icon(Icons.Filled.Email,contentDescription=null)},label={Text("Email")},selected=selectedItemIndex==2,onClick={selectedItemIndex=2})NavigationRailItem(icon={Icon(Icons.Filled.Person,contentDescription=null)},label={Text("Person")},selected=selectedItemIndex==3,onClick={selectedItemIndex=3})}
varselectedItemIndexbyremember{mutableStateOf(0)}Row(modifier=Modifier.fillMaxSize()){NavigationRail{NavigationRailItem(icon={Icon(Icons.Filled.Home,contentDescription=null)},label={Text("Home")},selected=selectedItemIndex==0,onClick={selectedItemIndex=0})NavigationRailItem(icon={Icon(Icons.Filled.Call,contentDescription=null)},label={Text("Call")},selected=selectedItemIndex==1,onClick={selectedItemIndex=1})NavigationRailItem(icon={Icon(Icons.Filled.Email,contentDescription=null)},label={Text("Email")},selected=selectedItemIndex==2,onClick={selectedItemIndex=2})NavigationRailItem(icon={Icon(Icons.Filled.Person,contentDescription=null)},label={Text("Person")},selected=selectedItemIndex==3,onClick={selectedItemIndex=3})}Column(modifier=Modifier.fillMaxHeight().weight(1f),horizontalAlignment=Alignment.CenterHorizontally,verticalArrangement=Arrangement.Center){Text("内容区域")}}
dataclassNavItem(valtitle:String,valicon:ImageVector,)valnavItems=listOf(NavItem("Home",Icons.Filled.Home),NavItem("Call",Icons.Filled.Call),NavItem("Email",Icons.Filled.Email),NavItem("Person",Icons.Filled.Person))varselectedItemIndexbyremember{mutableStateOf(0)}Row(modifier=Modifier.fillMaxSize()){NavigationRail{navItems.forEachIndexed{index,item->NavigationRailItem(icon={Icon(item.icon,contentDescription=item.title)},label={Text(item.title)},selected=selectedItemIndex==index,onClick={selectedItemIndex=index},)}}Column(modifier=Modifier.fillMaxHeight().weight(1f),horizontalAlignment=Alignment.CenterHorizontally,verticalArrangement=Arrangement.Center){when(selectedItemIndex){0->Text("Home")1->Text("Call")2->Text("Email")3->Text("Person")}}}

三、PullToRefreshBox(下拉刷新)

1、基本介绍
  • PullToRefreshBox 组件用于实现下拉刷新,该组件可以包裹可滚动内容,关键参数如下
  1. isRefreshing:指示刷新操作是否正在进行

  2. onRefresh:当发起刷新时执行的函数

2、演示
varitemsbyremember{mutableStateOf(List(5){"第${it+1}项"})}valscope=rememberCoroutineScope()varisRefreshingbyremember{mutableStateOf(false)}PullToRefreshBox(modifier=Modifier.fillMaxSize(),isRefreshing=isRefreshing,onRefresh={isRefreshing=truescope.launch{delay(1500)items=List((1..10).random()){"新数据${it+1}"}isRefreshing=false}}){LazyColumn(modifier=Modifier.fillMaxSize(),contentPadding=PaddingValues(16.dp),verticalArrangement=Arrangement.spacedBy(8.dp)){items(items){item->Card(modifier=Modifier.fillMaxWidth(),colors=CardDefaults.cardColors(containerColor=MaterialTheme.colorScheme.surfaceVariant)){Text(text=item,modifier=Modifier.padding(16.dp),style=MaterialTheme.typography.bodyLarge)}}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 15:27:41

实用视频修复指南:5分钟掌握Untrunc专业恢复技巧

实用视频修复指南:5分钟掌握Untrunc专业恢复技巧 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否遇到过珍贵的视频文件突然无法播放?当…

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

让旧iPhone重获新生:Legacy-iOS-Kit降级越狱全功能解析

让旧iPhone重获新生:Legacy-iOS-Kit降级越狱全功能解析 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …

作者头像 李华
网站建设 2026/4/10 15:21:14

Token 安全实践:从生成到校验的全流程解析

1. Token安全的重要性与基础概念 想象一下你住在一个高档小区,每次进出大门都需要刷门禁卡。这张卡片就是你在系统中的"Token"——它证明了你的身份,同时限制了你的活动范围(比如不能进入其他住户的私人区域)。在数字世…

作者头像 李华