Row — 是Jetpack Compose中的一个composable函数,用于将子元素放置在一行中。与Column不同,Row从左到右排列元素,并支持通过horizontalArrangement和verticalAlignment参数配置布局。根据Google Android Documentation, 2025,Row是与Column和Box并列的Compose三大基本容器之一,用于创建水平界面结构:按钮行、输入字段和带有文本的图标。
要点
Row — 是一个composable函数,将子元素按水平顺序排列。在Compose布局层次结构中,Row与Column和Box并列,占据基本容器的位置。
Row不需要指定尺寸——它会自动适应内容。除非设置了Modifier.fillMaxWidth或固定大小,否则Row的宽度等于子元素宽度之和(包括间距)。
Row的子元素可以拥有自己的修饰符,这些修饰符影响它们在容器内的位置。例如,Modifier.weight允许元素按比例占用可用空间的一部分。
根据Android Developers Blog, 2024,Row按顺序处理子元素,基于Compose的测量规则计算它们的尺寸:首先测量没有weight的元素,然后将剩余空间分配给有weight的元素。
Row的基本签名包括modifier、horizontalArrangement和verticalAlignment参数。所有子元素在最后的lambda块content中传递。
@Composable
fun RowExample() {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
Text(text = "一")
Text(text = "二")
Text(text = "三")
}
}
horizontalArrangement参数决定子元素在Row内沿水平轴如何分布。Arrangement类提供Start、End、Center、SpaceBetween、SpaceAround和SpaceEvenly值。
Arrangement.Start将元素放置在容器开头,Arrangement.End — 在末尾,Arrangement.Center — 在中间。这些值类似于CSS Flexbox中的justify-content属性。
Arrangement.SpaceBetween均匀分布元素,将第一个放在开头,最后一个放在末尾,其余元素之间间距相等。根据Material Design Guidelines, 2025,SpaceBetween最适合工具栏和导航行。
verticalAlignment参数垂直对齐元素。可用值包括Alignment.Top、Alignment.CenterVertically和Alignment.Bottom。当Row元素具有不同高度时此属性很有用——例如,图标旁边有多行文本。
| 值 | 描述 | 应用 |
|---|---|---|
| Start | 元素紧贴Row的开头 | 左对齐的行 |
| Center | 元素在容器中间 | 水平菜单、标题 |
| SpaceBetween | 均匀分布,第一个在开头,最后一个在末尾 | 工具栏、导航 |
| SpaceEvenly | 元素之间和边缘间距相等 | 按钮行、均匀网格 |
| SpaceAround | 元素之间间距相等,边缘间距为一半 | 轮播、图标库 |
Modifier.weight — 是仅在Row和Column内可用的修饰符,它按指定值在子元素之间分配可用空间。如果一个元素的权重为1.0f,另一个为2.0f,则第二个元素将占用两倍的空间。
没有weight的元素占用其内容所需的空间。剩余空间根据权重按比例分配给有weight的元素。这种行为类似于CSS Flexbox中的flex-grow属性。
根据Android Developer Documentation, 2025,weight仅在Row、Column和 BoxWithConstraints内有效。在Row中使用weight时,所有子元素分两次测量:首先是没有weight的元素,然后是有weight的元素。
@Composable
fun WeightExample() {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Start
) {
Text(
text = "左",
modifier = Modifier.weight(1.0f)
)
Text(text = "右")
}
}
第一个示例展示了带有图标和文本的Row — 联系人列表或设置的典型场景。Icon和Text被包裹在具有居中verticalAlignment的Row中。
@Composable
fun IconWithText() {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(8.dp)
) {
Icon(
imageVector = Icons.Default.Favorite,
contentDescription = "Favorite"
)
Spacer(modifier = Modifier.width(8.dp))
Text(text = "添加到收藏")
}
}
第二个示例展示了带有按钮和均匀分布的Row。SpaceEvenly保证所有按钮和容器边缘之间的间距相等。
@Composable
fun ButtonRow() {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
horizontalArrangement = Arrangement.SpaceEvenly
) {
Button(onClick = {}) { Text("取消") }
Button(onClick = {}) { Text("保存") }
}
}
第三个示例 — Card内的Row用于显示评分。嵌套的Row与Modifier.weight允许评分星标和数值占用固定空间。
@Composable
fun RatingRow(rating: Float) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "评分:",
modifier = Modifier.weight(1.0f)
)
Text(text = "$rating / 5.0")
}
}
在自适应布局中,Row需要控制宽度。如果Row的内容超出可用屏幕宽度,元素可能会溢出容器边界。为防止这种情况,请使用Modifier.horizontalScroll或切换到Column。
当组合Row与Modifier.weight时,为父级Row设置fillMaxWidth很重要——否则weight将分配不存在的空间。根据Material Design Guidelines, 2025,没有fillMaxWidth的带weight的Row被视为错误配置。
对于自适应界面,建议将Row与Box结合使用,或使用Arrangement.SpaceBetween在不同屏幕尺寸上自动分配元素。这可以在不需要媒体查询的情况下提供灵活性。
常见问题解答
Row水平放置元素(从左到右),而Column垂直放置(从上到下)。Row取代了旧View方法中的水平LinearLayout,Column则取代了垂直LinearLayout。
向Row添加Modifier.horizontalScroll修饰符。对于需要懒惰加载的大型列表,请使用LazyRow——它只渲染可见元素,并在滚动时重用它们。
是的,Row可以嵌套在另一个Row、Column或Box中。嵌套时请注意,内部Row将从父容器获得宽度,必要时为每个级别设置fillMaxWidth。
Modifier.weight根据指定权重在子元素之间分配Row中的剩余空间。权重为2.0f的元素将是权重为1.0f的元素的两倍宽。Weight仅在Row和Column内有效。
在创建Row时使用verticalAlignment = Alignment.CenterVertically参数。这将所有子元素沿垂直轴对齐,无论它们的高度如何。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。