【发布时间】:2021-01-28 17:58:43
【问题描述】:
默认情况下,Column {} 具有其最大子元素的宽度。如何使所有其他元素适合父 Column 的宽度?如果我使用Modifier.fillMaxWidth(),元素将占用整个可用空间并使父Column 更大。如何实现与 Modifier.matchParentWidth() 修饰符一样的行为?
【问题讨论】:
标签: android android-jetpack-compose
默认情况下,Column {} 具有其最大子元素的宽度。如何使所有其他元素适合父 Column 的宽度?如果我使用Modifier.fillMaxWidth(),元素将占用整个可用空间并使父Column 更大。如何实现与 Modifier.matchParentWidth() 修饰符一样的行为?
【问题讨论】:
标签: android android-jetpack-compose
您可以使用修饰符.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")
}
}
【讨论】:
解决方案是利用intrinsic measurements 的力量。
我们不使用Modifier.fillMaxWidth(),而是使用height(IntrinsicSize.Min)来匹配最大元素的最小宽度
【讨论】:
width(InstrinsicSize.Min,因为我们在谈论宽度?
这里我使用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))
}
【讨论】:
你可以简单地使用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()}")
}
【讨论】:
您将Modifier.width(300.dp) 应用到父列,该列中的子项可以占用的最大宽度为300.dp。
在这种情况下,在您的 Text 可组合对象上使用 Modifier.fillMaxWidth() 与使用 Modifier.preferredWidth(300.dp) 同义,因为它的宽度只能与父可组合对象一样宽。
【讨论】: