android - Jetpack Compose wrapContentHeight/heightIn 在按钮周围添加了额外的空间

标签 android kotlin android-jetpack-compose

我正在学习 Jetpack Compose,并且我创建了几组按钮作为练习。

这是按钮

@Composable
fun MyButton(
    text: String,
    modifier: Modifier = Modifier,
    isEnabled: Boolean = true,
    onClick: () -> Unit,
) {

        Button(
            enabled = isEnabled,
            onClick = { onClick() },
            modifier = modifier.width(270.dp).wrapContentHeight(),
        ) {
            Text(
                text = text,
                style = MaterialTheme.typography.button
            )
        }
    
}

问题是,如果我将按钮的高度设置为 wrapContentHeight 或使用具有不同最大和最小值的 heightIn,compose 会自动在按钮周围添加一个空格如这里所见

preview button wrapContentHeight

但是如果我删除 WrapContent,并使用固定高度,或者为 heightIn 定义相同的最小和最大高度,则不会出现此问题

@Composable
fun MyButton(
    text: String,
    modifier: Modifier = Modifier,
    isEnabled: Boolean = true,
    onClick: () -> Unit,
) {

        Button(
            enabled = isEnabled,
            onClick = { onClick() },
            modifier = modifier.width(270.dp).height(36.dp),
        ) {
            Text(
                text = text,
                style = MaterialTheme.typography.button
            )
        }

}

preview fixed height

这是用于功能列/预览的代码:

@Composable
private fun SampleScreen() {
    MyTheme{
        Surface(modifier = Modifier.fillMaxSize(),
            color = MaterialTheme.colors.background,){
            Column(
                horizontalAlignment = Alignment.CenterHorizontally,
                verticalArrangement = Arrangement.spacedBy(10.dp, Alignment.CenterVertically),
                modifier = Modifier.padding(20.dp)
            ) {
                var isEnabled by remember { mutableStateOf(false) }

                MyButton("Enable/Disable") {
                    isEnabled = !isEnabled
                }
                MyButton("Button") {}
                MyButton(text = "Disabled Button", isEnabled = isEnabled) {}
            }
        }
    }
}

即使我从列中删除 spacedBy 运算符,也会出现同样的问题。

我试图寻找对此的解释,但我没有设法找到任何东西。

感谢任何有解释的帮助或资源。

最佳答案

这是因为可组合项触摸区域的最小尺寸默认为 48.dp 以实现无障碍访问。但是,您可以使用

覆盖它
    CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
     Button(
        enabled = isEnabled,
        onClick = { onClick() },
        modifier = modifier.heightIn(min = 20.dp)
                .widthIn(min = 20.dp),
    ) {
        Text(
            text = text,
            style = MaterialTheme.typography.button
        )
    }
}

或者类似的东西

   Button(modifier = Modifier.absoluteOffset((-12).dp, 0.dp)){
            Text(
                text = text,
                style = MaterialTheme.typography.button
            )
        }

关于android - Jetpack Compose wrapContentHeight/heightIn 在按钮周围添加了额外的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74025824/

相关文章:

android - 如何禁用从适配器到 fragment 的后退按钮?

android - 图像目标 Vufroria 示例

android - 可下载字体的字体粗细不适用于android

android - Kotlin 是否 100% 支持 Ormlite? (数据类)

android - kotlin 验证输入字段

android - 如何添加可组合项列表作为参数

java - 如何确定经度和纬度坐标以在用户位置周围创建 1 英里半径?

kotlin - 在 Kotlin 类之间共享公共(public)属性

android - Jetpack 撰写 : Make full-screen (absolutely positioned) component

android - Compose Runtime 找不到我的自定义主题