【问题标题】:How to make element fill the remaining space inside a Row or a Column in Jetpack Compose如何使元素填充Jetpack Compose中行或列中的剩余空间
【发布时间】:2021-03-14 08:01:57
【问题描述】:

我试图连续显示两条文本消息,但是当第一个文本的大小很大时,第二个视图被推出屏幕,如下所示:

代码:

Row(modifier = Modifier.fillMaxWidth()) {
    Text(
        text = "safasfasdfsasdssdsaasdsadsdsaasdsasdsasdasddassdsssdasdadsasdasdsd",
        modifier = Modifier
            .padding(top = 12.dp, bottom = 12.dp, end = 12.dp, start = 10.dp)
            .background(Color.Gray)
    )
    Text(
        text = "12:00 am",
        style = messageTimeTextStyle,
        modifier = Modifier
            .padding(horizontal = 16.dp),
        maxLines = 1
    )
}

输出:

【问题讨论】:

    标签: android android-jetpack-compose


    【解决方案1】:

    您可以weight修饰符应用于长文本。

    .weight 修饰符调整元素的宽度,使其与Row 中其他加权同级元素的权重成正比。父级将测量未加权的子元素后剩余的水平空间划分,并根据这个权重分配

    类似:

    Row() {
        Text(text = "safasfasdfsasdssdsaasdsadsdsaasdsasdsasdasddassdsssdasdadsasdasdsd",
            Modifier
                .padding(top = 12.dp, bottom = 12.dp, end = 12.dp, start = 10.dp)
                .background(Color.Gray)
                .weight(1f)
             )
        Text(
            text = "12:00 am",
            modifier = Modifier
                .padding(horizontal = 16.dp),
            maxLines = 1
        )
    }
    

    Row() {
        Column(Modifier.weight(1f)){
            Text(text = "safasfasdfsasdssdsaasdsadsdsa.." , ....)
        }
        Column() {
            Text( text = "12.00 ..", .....)
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您将文本包装在盒子中并赋予盒子重量,那么您会得到您想要的:

      Row(modifier = Modifier.fillMaxWidth()) {
              Box(Modifier.weight(2f)) {
                  Text(
                      text = "safasfasdfsasdssdsaasdsafasfasdfsasdssdsaasdsafasfasdfsasdssdsaasd",
                      Modifier
                          .padding(top = 12.dp, bottom = 12.dp, end = 12.dp, start = 10.dp)
                          .background(Color.Gray)
                  )
              }
              Box(Modifier.weight(1f)) {
                  Text(
                      text = "12:00 am",
                      modifier = Modifier
                          .padding(horizontal = 16.dp),
                      maxLines = 1
                  )
              }
          }
      

      【讨论】:

      • 是的,我绝对可以这样做,但我希望第一个文本占用所有可用空间,只为第二个视图留出空间,正如正常线性布局所期望的那样