【问题标题】:Android compose: Surface can have only one direct measurable childAndroid compose:Surface 只能有一个直测孩子
【发布时间】:2020-10-14 05:01:04
【问题描述】:

我是 Jetpack compose 的新手,我已经创建了一个这样的可组合。

  Column(
        Modifier.clickable(onClick = onclick)
            .fillMaxWidth().background(pastelGray)
            .padding(16.dp)
    ) {

        Card(backgroundColor = Color.Cyan) {
   //         Image(asset = vectorResource(id = R.drawable.ic_coupon_back), modifier = Modifier.fillMaxWidth())
            Column(modifier = Modifier.padding(8.dp)) {
                Text(text = coupon.couponTitle, color = Color.Red, fontSize = 20.sp)
                Text(text = coupon.couponSubTitle, color = Color.Black, fontSize = 13.sp)
                Text(text = coupon.couponDateTitle, color = Color.Gray, fontSize = 11.sp)
            }
        }
    }

当我添加那个带注释的图片时,我收到了这个错误:

Surface can have only one direct measurable child!

我到现在都找不到原因。

【问题讨论】:

    标签: android image kotlin android-jetpack android-jetpack-compose


    【解决方案1】:

    因为您的代码中使用的 Card() 可组合在底层使用了 Surface:

    @Composable
    fun Card(
        modifier: Modifier = Modifier,
        shape: Shape = MaterialTheme.shapes.medium,
        backgroundColor: Color = MaterialTheme.colors.surface,
        contentColor: Color = contentColorFor(backgroundColor),
        border: BorderStroke? = null,
        elevation: Dp = 1.dp,
        content: @Composable () -> Unit
    ) {
        Surface(
            modifier = modifier,
            shape = shape,
            color = backgroundColor,
            contentColor = contentColor,
            elevation = elevation,
            border = border,
            content = content
        )
    }
    

    来源:Official Card Implementation code

    Surface 类似于ScrollView 不接受多个直系子代。因此,您需要将 Card() 中的代码包装到作为 Card 的直接子代或 Surface 的直接子代的单亲中,例如:

    Card(backgroundColor = Color.Cyan) {
         CardContent()
    }
    
    private fun CardContent() {
            Column() {
                // Image(asset = vectorResource(id = R.drawable.ic_coupon_back), modifier = Modifier.fillMaxWidth())
                   Column(modifier = Modifier.padding(8.dp)) {
                          Text(text = coupon.couponTitle, color = Color.Red, fontSize = 20.sp)
                          Text(text = coupon.couponSubTitle, color = Color.Black, fontSize = 13.sp)
                          Text(text = coupon.couponDateTitle, color = Color.Gray, fontSize = 11.sp)
                   }
            }
        }
    }
          
     
    

    【讨论】:

    • FrameLayout 就像一个 Stack/Box,如果您向其中添加更多元素并将最近添加的子元素放在顶部,它永远不会出错
    • 哦,感谢您的纠正我知道您可以在 FrameLayout 中添加任意数量的孩子,但它们也会相互重叠。话虽如此,当我在回答中提到 FrameLayout 时,我只想说您不能在此布局中在同一级别添加两个元素。这是我的观点。
    • @MR3YY 我认为 Surface 符合 Android ScrollView 的行为。对吗?
    • @AndrewChelix 完全正确!!我将编辑我的答案以提及ScrollView,谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2013-06-08
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多