'Match Width of Parent in Column (Jetpack Compose)
By default, Column {}
has the width of it's largest child element. How can I make all other elements to fit the width of the parent Column
? If I use Modifier.fillMaxWidth()
the elements will take up the entire available space and make the parent Column
larger. How can I achieve the same behavior like a Modifier.matchParentWidth()
Modifier would provide?
Solution 1:[1]
The solution is to leverage the power of intrinsic measurements.
Instead of using Modifier.fillMaxWidth()
we use width(IntrinsicSize.Min)
to match the width to the minimum width of the largest element
Solution 2:[2]
You can use the Modifier .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")
}
}
Solution 3:[3]
Here I'm using Modifier.fillMaxWidth
and the items doesn't make parent column larger :
@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))
}
}
What I usually do to achieve the matchParentWidth
is something like this (It's dirty but gets the job done):
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))
}
Solution 4:[4]
you can simply use 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()}")
}
Solution 5:[5]
You are applyingModifier.width(300.dp)
onto the parent column, the maximum width a child item in that column can occupy is 300.dp
.
Using Modifier.fillMaxWidth()
on your Text
composable in this context is synonymous to using Modifier.preferredWidth(300.dp)
because it can only get as wide as it's parent composable.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Hrafn |
Solution 2 | |
Solution 3 | Amirhosein |
Solution 4 | Deepak Das |
Solution 5 | Rafsanjani |