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?
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")
}
}
-
¿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
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:
@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()}")
}
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