Jetpack Compose Scaffold和TopAppBar(顶部导航)

Jetpack Compose 以下简称JC
JC提供了Scaffold这个组件来实现一些导航的效果,例如顶部菜单,底部导航,旁边的抽屉菜单等等,Scaffold的意思是脚手架,也就是Scaffold这是提供的一个支架,或者说固定了一些控件实现的位置。下面通过实现TopAppBar来说明。
TopAppBar有两种实现方式,下面这个是一种实现方式。

@Composable
public fun TopAppBar(
    title: @Composable () -> Unit,
    modifier: Modifier,
    navigationIcon: @Composable() (() -> Unit)?,
    actions: @Composable() (RowScope.() -> Unit),
    backgroundColor: Color,
    contentColor: Color,
    elevation: Dp
): Unit

还有第二种实现方式:

@Composable
public fun TopAppBar(
    modifier: Modifier,
    backgroundColor: Color,
    contentColor: Color,
    elevation: Dp,
    contentPadding: PaddingValues,
    content: @Composable() (RowScope.() -> Unit)
): Unit

两者方式的区别就是,第一种方式是已经做了限制的,内部Icon和文本的位置都有一定的限制,而第二种方式实际上是完全的自定义样式,需要自己手动设置位置,总的来说,还是推荐使用第一种比较方便。下面举例说明。
第一种方式:
看注释,写的非常清楚了,这种方式标题部分非常容易居中对齐,第二种方式可能出现问题。

TopAppBar(
                    //标题
                    title = {
                        Text(
                            modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center),
                            text = "TODO"
                        )

                    },
                    //导航按钮,一般为返回按钮
                    navigationIcon = {
                        IconButton(onClick = { println("返回") }) {
                            Icon(imageVector = Icons.Default.ArrowBack, contentDescription = null)
                        }
                    },
                    //其它按钮
                    actions = {
                        IconButton(onClick = { println("分享") }) {
                            Icon(imageVector = Icons.Default.Share, contentDescription = null)
                        }
                        IconButton(onClick = { println("设置") }) {
                            Icon(imageVector = Icons.Default.Settings, contentDescription = null)
                        }
                    },
                    //背景色
                    backgroundColor = Color(0xffffffaa),
                    //内容颜色
                    contentColor = Color.Black,
                    //底部阴影
                    elevation = 5.dp
                )

在这里插入图片描述
第二种方式的需要完全自定义控件,特别是标题Text的fillMaxWidth()方法,如果设置为1.0f,那么左边的按钮将看不到,如果写一个比例如0.8又可能出现位置的偏差,还是比较难以看着控制的,可能需要别的约束控件来约束位置,那样的话就比第一种方式麻烦的多。

 TopAppBar(contentColor = Color.Black, backgroundColor = Color.Red) {
                    //返回按钮
                    IconButton(onClick = { }) {
                        Icon(Icons.Filled.ArrowBack, null)
                    }
                    Text(text = "TODO", modifier = Modifier.fillMaxWidth(0.9f).wrapContentSize(Alignment.Center))
                    IconButton(onClick = { println("分享") }) {
                        Icon(Icons.Default.Share, null)
                    }
                    IconButton(onClick = { println("设置") }) {
                        Icon(Icons.Default.Settings, null)
                    }
                }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jetpack Compose 中创建底部导航栏可以使用 `BottomNavigation` 和 `BottomNavigationItem` 组件。以下是创建底部导航栏的步骤: 1. 导入所需的组件: ```kotlin import androidx.compose.foundation.Icon import androidx.compose.foundation.layout.Row import androidx.compose.material.BottomNavigation import androidx.compose.material.BottomNavigationItem import androidx.compose.material.IconToggleButton import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.painterResource import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController ``` 2. 创建底部导航栏的选项卡: ```kotlin sealed class BottomNavItem(val route: String, val icon: ImageVector, val title: String) { object Home : BottomNavItem("home", Icons.Filled.Home, "Home") object Search : BottomNavItem("search", Icons.Filled.Search, "Search") object Profile : BottomNavItem("profile", Icons.Filled.Person, "Profile") } val bottomNavItems = listOf( BottomNavItem.Home, BottomNavItem.Search, BottomNavItem.Profile ) ``` 3. 创建底部导航栏: ```kotlin @Composable fun BottomNavigationBar( navController: NavHostController ) { var selectedTab by remember { mutableStateOf(BottomNavItem.Home) } BottomNavigation { val navBackStackEntry by navController.currentBackStackEntryAsState() val currentRoute = navBackStackEntry?.destination?.route bottomNavItems.forEach { screen -> BottomNavigationItem( icon = { Icon(screen.icon, contentDescription = null) }, label = { Text(screen.title) }, selected = currentRoute == screen.route, onClick = { selectedTab = screen navController.navigate(screen.route) { popUpTo(navController.graph.startDestinationId) launchSingleTop = true } } ) } } } ``` 在 `BottomNavigationBar` 中,我们首先定义了一个 `selectedTab` 变量,用于跟踪当前选中的选项卡。然后,我们使用 `BottomNavigation` 组件创建底部导航栏,并使用 `BottomNavigationItem` 组件创建每个选项卡。我们使用 `navController` 控制导航,在点击选项卡时,更新 `selectedTab` 变量,然后导航到对应的目的地。 最后,我们可以将 `BottomNavigationBar` 组件添加到 `Scaffold` 中,创建一个带有底部导航栏的应用程序界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值