一、核心基础:Row 基本用法
在 Android 开发中,Row 是 Jetpack Compose 中用于水平排列子组件的核心布局组件,相当于传统 View 体系中的 LinearLayout(orientation = HORIZONTAL),但功能更灵活、写法更简洁。下面从核心用法、属性详解、常见场景、注意事项四个维度,详细总结 Row 的使用。
1. 最简示例
Row 是组合函数,直接包裹需要水平排列的子组件即可:
@Composable
fun BasicRowDemo() {
// 基础 Row:水平排列 Text 和 Button
Row(
modifier = Modifier
.fillMaxWidth() // 占满父布局宽度
.padding(16.dp) // 内边距
) {
Text(
text = "左侧文本",
modifier = Modifier.padding(end = 8.dp) // 与右侧组件间距
)
Button(onClick = { /* 点击事件 */ }) {
Text("右侧按钮")
}
}
}
效果:文本在左、按钮在右,水平排列,整体占满屏幕宽度。
2. 核心参数说明
Row 的关键参数决定了子组件的排列方式、对齐方式,核心参数如下:
Row(
modifier: Modifier = Modifier, // 布局修饰符(宽高、边距、背景等)
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, // 水平排列方式
verticalAlignment: Alignment.Vertical = Alignment.Top, // 垂直对齐方式
content: @Composable RowScope.() -> Unit // 子组件内容
)
二、关键属性详解
1. horizontalArrangement:水平排列方式(子组件之间的间距 / 分布)
控制子组件在水平方向的分布逻辑,常用值:
| 参数值 | 效果说明 | 适用场景 |
|---|---|---|
Arrangement.Start | 子组件靠左排列(默认) | 常规左对齐布局 |
Arrangement.End | 子组件靠右排列 | 右侧操作按钮(如 “取消”) |
Arrangement.Center | 子组件水平居中 | 居中展示的横向布局 |
Arrangement.SpaceBetween | 子组件均匀分布,首尾贴边 | 左右各一个组件(如标题 + 更多) |
Arrangement.SpaceAround | 子组件均匀分布,首尾有一半间距 | 多个平级按钮(如 “编辑 / 删除 / 分享”) |
Arrangement.SpaceEvenly | 子组件均匀分布,所有间距相等 | 均分横向空间的布局 |
示例:SpaceBetween 实现 “标题 + 更多” 布局
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text("列表标题", fontSize = 18.sp)
Text("更多", color = Color.Blue)
}}
2. verticalAlignment:垂直对齐方式(子组件在垂直方向的对齐)
控制子组件在 Row 垂直方向的对齐逻辑,常用值:
| 参数值 | 效果说明 |
|---|---|
Alignment.Top | 子组件靠上对齐(默认) |
Alignment.CenterVertically | 子组件垂直居中(最常用) |
Alignment.Bottom | 子组件靠下对齐 |
Alignment.Baseline | 子组件按文字基线对齐(仅文本类组件有效) |
示例:Baseline 对齐(解决文本和按钮文字错位)
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.Baseline // 按文字基线对齐
) {
Text("用户名", fontSize = 16.sp)
Text("(必填)", fontSize = 12.sp, color = Color.Gray)
}
3. RowScope 特有的修饰符(子组件专属)
子组件在 Row 内部时,可使用 RowScope 提供的专属修饰符,核心是 weight:
weight(float):子组件占据剩余水平空间的比例(类似传统 View 的layout_weight);- 作用:实现 “固定宽度 + 自适应宽度” 布局。
示例:权重布局(左侧固定宽度,右侧自适应)
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp)
) {
// 左侧固定宽度:80dp
Text(
text = "姓名:",
modifier = Modifier.width(80.dp)
)
// 右侧占满剩余宽度
TextField(
value = "",
onValueChange = {},
modifier = Modifier.weight(1f) // 权重1,占满剩余空间
)
}
三、常见使用场景
场景 1:基础横向布局(如列表项)
@Composable
fun ListItemRow() {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.clickable { /* 点击事件 */ },
verticalAlignment = Alignment.CenterVertically
) {
// 左侧图标(固定大小)
Icon(
Icons.Default.Person,
contentDescription = "头像",
modifier = Modifier.size(40.dp)
)
// 中间文本区域(自适应宽度)
Column(
modifier = Modifier
.weight(1f)
.padding(horizontal = 12.dp)
) {
Text("张三", fontSize = 16.sp)
Text("ID:123456", fontSize = 12.sp, color = Color.Gray)
}
// 右侧箭头(固定大小)
Icon(Icons.Default.ArrowForwardIos, contentDescription = "箭头", modifier = Modifier.size(20.dp))
}
}
场景 2:权重均分布局(如底部导航)
@Composable
fun BottomNavRow() {
Row(
modifier = Modifier.fillMaxWidth().height(56.dp).background(Color.White),
horizontalArrangement = Arrangement.SpaceEvenly
) {
// 三个按钮均分宽度
repeat(3) { index ->
Column(
modifier = Modifier.weight(1f),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(
when (index) {
0 -> Icons.Default.Home
1 -> Icons.Default.Search
else -> Icons.Default.Person
},
contentDescription = null
)
Text(when (index) {
0 -> "首页"
1 -> "搜索"
else -> "我的"
}, fontSize = 12.sp)
}
}
}
}
场景 3:嵌套布局(Row + Column)
@Composable
fun NestedRowColumn() {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
// 左侧图标
Icon(Icons.Default.Notifications, contentDescription = "通知", modifier = Modifier.size(32.dp))
// 右侧列布局(垂直排列文本)
Column(
modifier = Modifier
.weight(1f)
.padding(start = 12.dp)
) {
Text("系统通知", fontSize = 16.sp, fontWeight = FontWeight.Bold)
Text("您的订单已发货", fontSize = 14.sp, color = Color.Gray)
}
// 右侧时间文本
Text("10分钟前", fontSize = 12.sp, color = Color.Gray)
}
}
四、注意事项 & 最佳实践
-
避免过度嵌套:Row 嵌套 Column/Row 尽量不超过 2 层,复杂布局可拆分为独立 Composable 函数,提升可读性;
-
weight 使用技巧:
- 只有一个子组件用
weight(1f)时,会占满剩余空间; - 多个子组件用 weight 时,按比例分配(如
weight(1f)和weight(2f)按 1:2 分配); - 不要给
weight子组件同时设置fillMaxWidth(),会冲突;
- 只有一个子组件用
-
性能优化:
- 固定大小的子组件优先设置
width()/size(),避免 Row 重复测量; - 长列表中的 Row 布局,配合
remember/lazyList提升性能;
- 固定大小的子组件优先设置
-
处理内容溢出:
-
如果子组件总宽度超过 Row 宽度,会出现溢出,可通过
Modifier.horizontalScroll(rememberScrollState())实现横向滚动:kotlin
Row( modifier = Modifier .fillMaxWidth() .horizontalScroll(rememberScrollState()) // 横向滚动 ) { // 多个宽度超屏的子组件 repeat(10) { Text("标签$it", modifier = Modifier.padding(4.dp).background(Color.LightGray).padding(8.dp)) } }
-
总结
Row是 Compose 中水平排列子组件的核心布局,核心参数是horizontalArrangement(水平分布)、verticalAlignment(垂直对齐);- 子组件通过
weight实现 “固定 + 自适应” 宽度布局,是最常用的进阶用法; - 常见场景包括列表项、底部导航、横向表单等,配合
scroll可处理内容溢出,避免布局报错。