You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中weight修饰符致可组合项消失的问题求助

问题:Compose中添加weight修饰符后文本消失,无法按比例分配宽度

我查过相关问题但没完全搞懂原因,没用到requiredHeight修饰符,但遇到类似问题:不给元素加weight时文本显示正常,加上后文本直接消失。

我的场景是Card放在LazyHorizontalStaggeredGrid里,Card高度由容器决定。现在想实现折叠展开的文本元素宽度是第一个列元素的3倍,但用weight就出问题,求解决办法。


出现问题的代码(带weight)

@Composable
fun ToiletItem(indexedToilet: IndexedValue<Toilet>, modifier: Modifier = Modifier) {
    val toilet = indexedToilet.value
    var expanded by remember { mutableStateOf(false) }

    Card(modifier = modifier.clickable { expanded = !expanded }) {
        Row(
            modifier = Modifier.animateContentSize(),
            verticalAlignment = Alignment.CenterVertically,
        ) {
            Column(
                modifier = Modifier
                    .padding(12.dp)
                    .weight(1f),
            ) {
                Text(
                    "${indexedToilet.index + 1}.",
                    style = MaterialTheme.typography.displaySmall,
                    textAlign = TextAlign.Center,
                )
                Text(
                    stringResource(R.string.toilet),
                    style = MaterialTheme.typography.labelMedium,
                    textAlign = TextAlign.Center,
                )
            }
            if (expanded) Text(
                stringResource(toilet.textRes),
                modifier = Modifier
                    .padding(12.dp)
                    .weight(3f),
                style = MaterialTheme.typography.bodyMedium,
                textAlign = TextAlign.Justify,
            )
            Image(
                painterResource(toilet.imageRes),
                contentDescription = null,
                modifier = Modifier.fillMaxHeight(),
                contentScale = ContentScale.FillHeight,
                alignment = Alignment.CenterEnd,
            )
        }
    }
}

效果:添加weight后文本消失,布局异常。


移除weight后的代码片段(正常显示但比例不对)

Card(modifier = modifier.clickable { expanded = !expanded }) {
        Row(
            modifier = Modifier.animateContentSize(),
            verticalAlignment = Alignment.CenterVertically,
        ) {
            Column(
                modifier = Modifier
                    .padding(12.dp)
                    //.weight(1f),
            ) {
...

效果:文本正常显示,但无法实现1:3的宽度比例。


解决办法

问题根源是Row和LazyHorizontalStaggeredGrid的布局逻辑冲突:weight需要父布局有确定的可用宽度,但LazyHorizontalStaggeredGrid的子项默认是包裹内容宽度,导致weight计算时没有可用空间,文本被挤压消失。

方案1:给Row添加fillMaxWidth()(推荐)

让Row占满父容器的宽度,这样weight就能正确计算比例:

Row(
    modifier = Modifier
        .animateContentSize()
        .fillMaxWidth(), // 新增该行
    verticalAlignment = Alignment.CenterVertically,
) {
    // 原有代码保持不变
}

这个方案最灵活,不用固定数值,能适配不同屏幕尺寸。

方案2:固定宽度实现比例

如果不想让Row占满宽度,可以直接给元素设置固定宽度来实现1:3比例:

Row(
    modifier = Modifier
        .animateContentSize(),
    verticalAlignment = Alignment.CenterVertically,
) {
    Column(
        modifier = Modifier
            .padding(12.dp)
            .width(32.dp), // 固定第一个列的宽度
    ) {
        // 原有文本代码
    }
    if (expanded) Text(
        stringResource(toilet.textRes),
        modifier = Modifier
            .padding(12.dp)
            .width(96.dp), // 设置为第一个列的3倍宽度
        style = MaterialTheme.typography.bodyMedium,
        textAlign = TextAlign.Justify,
    )
    // 图片代码保持不变
}

内容的提问来源于stack exchange,提问作者askSoap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:03:21