android - 如何在 TopAppBar 的布局中心对齐标题?

标签 android android-jetpack android-jetpack-compose

TopAppBar(
       backgroundColor = Color.Transparent,
       elevation = 0.dp,
       modifier= Modifier.fillMaxWidth(),
       navigationIcon = {
               IconButton(
                   onClick = { TODO },
                   enabled = true,
               ) {
                   Icon(
                       painter = painterResource(id = R.drawable.icon_back_arrow),
                       contentDescription = "Back",
                   )
               }
           }
       },
       title = {
           Text(
               modifier = if (action == null) Modifier.fillMaxWidth() else Modifier,
               textAlign = if (action == null) TextAlign.Center else TextAlign.Start,
               maxLines = 1,
               text = "Hello"
           )
       },
       actions = {
           action?.run {
               Text(
                   modifier = Modifier
                       .padding(horizontal = 16.dp)
                       .clickable(onClick = TODO),
                   color = Color.Green,
                   text ="Cancel",
               )
           }
       } 
我是 jetpack 的新手,如果 action 为空,我想将 TopAppBar 的标题对齐在中心。标题未对齐布局中心。当没有 navigationIcon 它可以工作但添加 navigationIcon 它显示得稍微正确。如何在布局中心制作标题文本。

最佳答案

Material 2 您必须使用 TopAppBar 的另一个构造函数没有预定义的内容插槽,允许您自定义内部内容的布局。
您可以执行以下操作:

val appBarHorizontalPadding = 4.dp
val titleIconModifier = Modifier.fillMaxHeight()
    .width(72.dp - appBarHorizontalPadding)

TopAppBar(
    backgroundColor = Color.Transparent,
    elevation = 0.dp,
    modifier= Modifier.fillMaxWidth()) {

    //TopAppBar Content
    Box(Modifier.height(32.dp)) {

        //Navigation Icon 
        Row(titleIconModifier, verticalAlignment = Alignment.CenterVertically) {                
            CompositionLocalProvider(
                LocalContentAlpha provides ContentAlpha.high,
            ) {
                IconButton(
                    onClick = { },
                    enabled = true,
                ) {
                    Icon(
                        painter = painterResource(id = R.drawable.ic_add_24px),
                        contentDescription = "Back",
                    )
                }
            }
        }

        //Title
        Row(Modifier.fillMaxSize(),
            verticalAlignment = Alignment.CenterVertically) {

            ProvideTextStyle(value = MaterialTheme.typography.h6) {
                CompositionLocalProvider(
                    LocalContentAlpha provides ContentAlpha.high,
                ){
                    Text(
                        modifier = Modifier.fillMaxWidth(),
                        textAlign = TextAlign.Center,
                        maxLines = 1,
                        text = "Hello"
                    )
                }
            }
        }

        //actions
        CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
            Row(
                Modifier.fillMaxHeight(),
                horizontalArrangement = Arrangement.End,
                verticalAlignment = Alignment.CenterVertically,
                content = actions
            )
        }
    }
}
enter image description here

Material 3 您可以简单地使用 CenterAlignedTopAppBar :
CenterAlignedTopAppBar(
    title = { Text("Centered TopAppBar") },
    navigationIcon = {
        IconButton(onClick = { /* doSomething() */ }) {
            Icon(
                imageVector = Icons.Filled.Menu,
                contentDescription = "Localized description"
            )
        }
    }
)
enter image description here

关于android - 如何在 TopAppBar 的布局中心对齐标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67497414/

相关文章:

android - 如何只在sqlite数据库中插入一次?即使我再次返回 Activity 也停止插入?

android - 如何将 viewModel 范围限定为与 NavHost 无关的对话框可组合函数

android - Jetpack 撰写 : Managing Shared UI State

android - 塑造 Android Material Design

android - 如何创建 Android Things 的 bundle 并将其推送到 OTA 上?

android - 多个数据源的分页库DataSource.Factory

android - 如何使用导航组件在单个 fragment 上正确添加选项菜单而不破坏 "up behavior"

Android 导航 - 有没有办法清除所有 saveState 以在下次导航时强制重新加载每个屏幕?

java - 从 Android 应用程序堆栈中手动删除 Activity

android - Hilt 注入(inject)不适用于 BroadcastReceiver