Hacer coincidir el ancho del padre en la columna (Jetpack Compose)

3 minutos de lectura

Por defecto, Column {} tiene el ancho de su elemento hijo más grande. ¿Cómo puedo hacer que todos los demás elementos se ajusten al ancho del padre? Column? si uso Modifier.fillMaxWidth() los elementos ocuparán todo el espacio disponible y harán que el padre Column más grande ¿Cómo puedo lograr el mismo comportamiento como un Modifier.matchParentWidth() Modificador proporcionaría?

Avatar de usuario de Gabriele Mariotti
gabriele mariotti

Puedes usar el modificador .width(IntrinsicSize.Max)

 Column(Modifier.width(IntrinsicSize.Max)) {
        Box(Modifier.fillMaxWidth().background(Color.Gray)) {
            Text("Short text")
        }
        Box(Modifier.fillMaxWidth().background(Color.Yellow)) {
            Text("Extremely long text giving the width of its siblings")
        }
        Box(Modifier.fillMaxWidth().background(Color.Green)) {
            Text("Medium length text")
        }
    }

ingrese la descripción de la imagen aquí

  • ¿Alguna idea de cuándo usar .Min vs .Max? la respuesta aceptada usa .Min mientras que la tuya es .Max.

    – Ángel Koh

    31 de agosto de 2021 a las 4:51

Avatar de usuario de Yannick
Yannick

La solución es aprovechar el poder de medidas intrínsecas.

En lugar de usar Modifier.fillMaxWidth() usamos width(IntrinsicSize.Min) para hacer coincidir el ancho con el ancho mínimo del elemento más grande

Aquí estoy usando Modifier.fillMaxWidth y los elementos no hacen que la columna principal sea más grande: Hacer coincidir el ancho del padre en la columna (Jetpack Compose)

@Composable
fun Demo() {
Column(modifier = Modifier.width(300
    .dp)) {
    Text(text = "with fillMaxWidth modifier",modifier = Modifier.fillMaxWidth().background(Color.Red))
    Text(text = "without fillMaxWidth modifier",modifier = Modifier.background(Color.Gray))
 }

}

Lo que suelo hacer para lograr el matchParentWidth es algo como esto (está sucio pero hace el trabajo):

val context = AmbientContext.current.resources
val displayMetrics = context.displayMetrics
val scrWidth = displayMetrics.widthPixels / displayMetrics.density

Column(modifier = Modifier.width(300
    .dp)) {
    Text(text = "with fillMaxWidth modifier",modifier = Modifier.fillMaxWidth().background(Color.Red))
    Text(text = "without fillMaxWidth modifier",modifier = Modifier
        .preferredWidth(scrWidth.dp)
        .background(Color.Gray))
}

  • Hola, estoy buscando un tamaño dinámico aquí. No puedo especificar un tamaño fijo para la columna principal. La columna debe ser tan ancha como su hijo más ancho.

    – Yannick

    31/01/2021 a las 23:00

  • Esta es la mejor solución si desea tener una geometría proporcional perfecta de píxeles. Gracias. ¡Me faltaba la división por densidad! Muchas gracias.

    – C. Hellmann

    12 abr 2021 a las 10:20

  • También lo que logré con él: gist.github.com/cicerohellmann/20f276f04a694e7bb588d84162169a73

    – C. Hellmann

    12 abr 2021 a las 10:30

simplemente puedes usar fillMaxWidth()

 Row(modifier = Modifier
        .fillMaxWidth()
        .background(Color.Cyan),) {
        Spacer(modifier = Modifier.padding(start = 4.dp))
        Image(
            painter = painterResource(R.drawable.tom_jerry),
            contentDescription ="this is image",

            modifier = Modifier
                .size(40.dp)
                .clip(shape = CircleShape).align(CenterVertically),
            alignment = Alignment.Center,
            contentScale = ContentScale.FillHeight


        )
        Column(modifier = Modifier.padding(start = 10.dp)) {
            Text(text = "Name : ${msg.name}")
            Text(text = "age : ${msg.age.toString()}")

        }

ingrese la descripción de la imagen aquí

usted está aplicandoModifier.width(300.dp) en la columna principal, el ancho máximo que puede ocupar un elemento secundario en esa columna es 300.dp.

Usando Modifier.fillMaxWidth() en tu Text componible en este contexto es sinónimo de usar Modifier.preferredWidth(300.dp) porque solo puede ser tan ancho como su componente principal.

  • Hola, estoy buscando un tamaño dinámico aquí. No puedo especificar un tamaño fijo para la columna principal. La columna debe ser tan ancha como su hijo más ancho.

    – Yannick

    31/01/2021 a las 23:00

  • Hola, estoy buscando un tamaño dinámico aquí. No puedo especificar un tamaño fijo para la columna principal. La columna debe ser tan ancha como su hijo más ancho.

    – Yannick

    31/01/2021 a las 23:00

¿Ha sido útil esta solución?