匹配列中父项的宽度 (Jetpack Compose)
Match Width of Parent in Column (Jetpack Compose)
默认情况下,Column {}
具有其最大子元素的宽度。我怎样才能使所有其他元素适应父元素 Column
的宽度?如果我使用 Modifier.fillMaxWidth()
元素将占据整个可用 space 并使父元素 Column
变大。我怎样才能实现与 Modifier.matchParentWidth()
修饰符提供的相同行为?
我在这里使用 Modifier.fillMaxWidth
并且项目不会使父列变大:
@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))
}
}
为了达到 matchParentWidth
我通常做的事情是这样的(它很脏但是完成了工作):
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))
}
您正在将Modifier.width(300.dp)
应用到父列,该列中的子项可以占据的最大宽度为300.dp
。
在此上下文中,在 Text
可组合项上使用 Modifier.fillMaxWidth()
等同于使用 Modifier.preferredWidth(300.dp)
,因为它的宽度只能与其父可组合项一样宽。
解决方案是利用 intrinsic measurements 的力量。
我们使用 width(IntrinsicSize.Min)
而不是使用 Modifier.fillMaxWidth()
来将宽度与最大元素的最小宽度相匹配
您可以使用修饰符.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")
}
}
你可以简单地使用 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()}")
}
默认情况下,Column {}
具有其最大子元素的宽度。我怎样才能使所有其他元素适应父元素 Column
的宽度?如果我使用 Modifier.fillMaxWidth()
元素将占据整个可用 space 并使父元素 Column
变大。我怎样才能实现与 Modifier.matchParentWidth()
修饰符提供的相同行为?
我在这里使用 Modifier.fillMaxWidth
并且项目不会使父列变大:
@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))
}
}
为了达到 matchParentWidth
我通常做的事情是这样的(它很脏但是完成了工作):
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))
}
您正在将Modifier.width(300.dp)
应用到父列,该列中的子项可以占据的最大宽度为300.dp
。
在此上下文中,在 Text
可组合项上使用 Modifier.fillMaxWidth()
等同于使用 Modifier.preferredWidth(300.dp)
,因为它的宽度只能与其父可组合项一样宽。
解决方案是利用 intrinsic measurements 的力量。
我们使用 width(IntrinsicSize.Min)
而不是使用 Modifier.fillMaxWidth()
来将宽度与最大元素的最小宽度相匹配
您可以使用修饰符.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")
}
}
你可以简单地使用 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()}")
}