是否可以测量字符串宽度以正确调整文本可组合项的大小?

TZ0*_*Z04 17 text-width android-jetpack-compose

我正在开发一个基于 Jetpack Compose 的应用程序,它显示一个包含 3 列的简单列表。

\n

显示 3 列的屏幕截图

\n

一切都在原则上进行。我正在努力解决的是如何自动确定列的大小。

\n

例如,日期列的宽度要求将根据用户的区域设置和字体大小而显着不同。

\n

24.12.2021 - 20:00需要的屏幕空间比

\n

12/14/2021 - 08:00 PM

\n

我希望我能做的是使用示例日期,根据当前的区域设置和字体大小对其进行测量,然后相应地设置所有列表条目的宽度。

\n

与此类似的东西:

\n
val d = Date(2021, 12, 30, 23, 59, 59) // Sample date\nval t = dateFormat.format(d) + " - " + timeFormat.format(d) // Build the output string\nval dateColumnWidth = measureTextWidth(t, fontSize) // This is what I need\n\n\xe2\x80\xa6\nLazyColumn {\n\xe2\x80\xa6\nRow {\n    Text(text = t, Modifier.width(dateColumnWidth.dp), fontSize = fontSize.sp))\n    Text(text = value)\n    Text(text = comment)\n    }\n}   \n\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

我已经研究这个问题好几个星期了,但是像上面的“measureTextWidth”这样的函数似乎不存在。

\n

有什么办法可以实现这一点吗?

\n

Phi*_*hov 31

SubcomposeLayout你可以这样使用:

@Composable
fun MeasureUnconstrainedViewWidth(
    viewToMeasure: @Composable () -> Unit,
    content: @Composable (measuredWidth: Dp) -> Unit,
) {
    SubcomposeLayout { constraints ->
        val measuredWidth = subcompose("viewToMeasure", viewToMeasure)[0]
            .measure(Constraints()).width.toDp()

        val contentPlaceable = subcompose("content") {
            content(measuredWidth)
        }[0].measure(constraints)
        layout(contentPlaceable.width, contentPlaceable.height) {
            contentPlaceable.place(0, 0)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的视图中使用它:

MeasureUnconstrainedViewWidth(
    viewToMeasure = {
        Text("your sample text")
    }
) { measuredWidth ->
    // use measuredWidth to create your view
}
Run Code Online (Sandbox Code Playgroud)

  • @DaniilPozdnyakov 在这种情况下,你不应该在测量过程中覆盖约束 - 我正在使用 `Constraints()` 进行操作,你可以使用 `constraints.copy(maxHeight = Constraints.Infinity)` 代替 (2认同)