我目前正在使用Jetpack Compose中的自定义布局.这是我到目前为止所得到的测试结果:

@Preview(widthDp = 1000, heightDp = 1000)
@Composable
fun MyLayout() {
    Layout({ Box(Modifier.size(48.dp).background(Color.Blue)) }) { measurables, constraints ->
        val placeables = measurables.map { it.measure(constraints) }
        layout(constraints.maxWidth, constraints.maxHeight) {
            placeables.forEach { it.place(0, 0) }
        }
    }
}

我这里的问题是Box填充了整个布局,而不仅仅是48.dp的大小.有人能解释一下为什么会这样吗?我读了here篇关于创建自定义布局的文章,但找不到任何有用的东西.

推荐答案

Layout大小由传入layout(width, height)的大小决定.

你的Layout没有任何修改器,这就是为什么它有maxWidth/maxHeight约束等于可用间距.使用layout(constraints.maxWidth, constraints.maxHeight)与使用Modifier.fillMaxSize的效果相同.实际上,有了Modifier.fillMaxSize,你可以将最大和最小约束设置为可用大小.

要解决这个问题,您有两个 Select :

  1. Modifier.size应用于Layout本身,而不是应用于Box——在这种情况下,最大/最小约束将为48.dp

  2. 根据可放置位置计算布局大小.实际的代码取决于您希望得到的布局.您的代码看起来像Box模拟,所以您需要最大的所有可放置大小:

    layout(placeables.maxOfOrNull { it.width } ?: 0, placeables.maxOfOrNull { it.height } ?: 0) {
    

Android相关问答推荐

替换- prop -中的值(adb shell getprop)

在Android Studio中,如何在BuildSrc Dependenices Kotlin文件中指定时标记与旧版本的依赖关系

第一次使用onBackPressed()、NavigateUp()加载时MapView崩溃

如何将.txtassets资源 转换为ArrayList<;字符串>;kotlin格式?

Hilt+Worker NoSuchMethodException:<;init>;[class android.content.Context,class androidx.work.WorkerParameters]

由于Xcode运行脚本阶段没有指定输出,在IOS Emulator中的KMM项目中生成失败

使用 JNI 从 Android 应用程序中使用 Kotlin/Native 预构建共享库

使用 Jetpack Compose 在 Android TV 上启用系统声音

如何在每次显示可组合项时执行代码(并且只执行一次)

在段的中心绘制饼图(甜甜圈图)的图例

为什么我要使用 $version 而不是2.7.0?

如何在 JetpackCompose 的 LazyColumn 中 Select 多个项目

在移动设备上看到时如何增加 PasswordField 文本?

Jetpack Compose UI - 在 AlertDialog 中单击时按钮宽度会发生变化

Android:appcompat 和 material 如何从默认创建 appcompat 和 material 视图?

java.lang.String 类型的值 Forbidden 无法转换为 JSONObject

如何从我的 android 应用程序中删除 QUERY_ALL_PACKAGES 权限?

关于launchWhenX和repeatOnLifecycle的问题

如何删除 Ktor 客户端 2.0.0 的默认标头

使用 Android 字符串数组在 Room 中迁移