Android Row 的使用

一、核心基础:Row 基本用法

在 Android 开发中,Row 是 Jetpack Compose 中用于水平排列子组件 的核心布局组件,相当于传统 View 体系中的 LinearLayout(orientation = HORIZONTAL),但功能更灵活、写法更简洁。下面从核心用法、属性详解、常见场景、注意事项 四个维度,详细总结 Row 的使用。

1. 最简示例

Row 是组合函数,直接包裹需要水平排列的子组件即可:

kotlin 复制代码
@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 的关键参数决定了子组件的排列方式、对齐方式,核心参数如下:

less 复制代码
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 实现 "标题 + 更多" 布局

ini 复制代码
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 对齐(解决文本和按钮文字错位)

ini 复制代码
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);
  • 作用:实现 "固定宽度 + 自适应宽度" 布局。

示例:权重布局(左侧固定宽度,右侧自适应)

ini 复制代码
Row(
    modifier = Modifier.fillMaxWidth().padding(16.dp)
) {
    // 左侧固定宽度:80dp
    Text(
        text = "姓名:",
        modifier = Modifier.width(80.dp)
    )
    // 右侧占满剩余宽度
    TextField(
        value = "",
        onValueChange = {},
        modifier = Modifier.weight(1f) // 权重1,占满剩余空间
    )
}

三、常见使用场景

场景 1:基础横向布局(如列表项)

ini 复制代码
@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:权重均分布局(如底部导航)

kotlin 复制代码
@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)

scss 复制代码
@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)
    }
}

四、注意事项 & 最佳实践

  1. 避免过度嵌套:Row 嵌套 Column/Row 尽量不超过 2 层,复杂布局可拆分为独立 Composable 函数,提升可读性;

  2. weight 使用技巧

    • 只有一个子组件用 weight(1f) 时,会占满剩余空间;
    • 多个子组件用 weight 时,按比例分配(如 weight(1f)weight(2f) 按 1:2 分配);
    • 不要给 weight 子组件同时设置 fillMaxWidth(),会冲突;
  3. 性能优化

    • 固定大小的子组件优先设置 width()/size(),避免 Row 重复测量;
    • 长列表中的 Row 布局,配合 remember/lazyList 提升性能;
  4. 处理内容溢出

    • 如果子组件总宽度超过 Row 宽度,会出现溢出,可通过 Modifier.horizontalScroll(rememberScrollState()) 实现横向滚动:

      kotlin

      scss 复制代码
      Row(
          modifier = Modifier
              .fillMaxWidth()
              .horizontalScroll(rememberScrollState()) // 横向滚动
      ) {
          // 多个宽度超屏的子组件
          repeat(10) {
              Text("标签$it", modifier = Modifier.padding(4.dp).background(Color.LightGray).padding(8.dp))
          }
      }

总结

  1. Row 是 Compose 中水平排列子组件 的核心布局,核心参数是 horizontalArrangement(水平分布)、verticalAlignment(垂直对齐);
  2. 子组件通过 weight 实现 "固定 + 自适应" 宽度布局,是最常用的进阶用法;
  3. 常见场景包括列表项、底部导航、横向表单等,配合 scroll 可处理内容溢出,避免布局报错。
相关推荐
林栩link3 小时前
Now in Android 现代应用开发实践(三):架构设计(UI)
android·android jetpack
段娇娇5 小时前
Android jetpack LiveData (二) 原理篇
android·android jetpack
阿巴斯甜7 小时前
Android LazyColumn的使用
android jetpack
阿巴斯甜1 天前
Compose 内置的 Modifier 用法总结
android jetpack
simplepeng1 天前
TikTok 通过 Jetpack Compose 将代码大小减少 58%,并提升了新功能的 app 性能
android·android jetpack
BoomHe1 天前
Kotlin shareIn 和 stateIn 使用场景
android·kotlin·android jetpack
俩个逗号。。2 天前
Compose 预览报错:java.lang.NoSuchMethodError
android·android jetpack
黄林晴2 天前
Android Room 3.0 来了,这次改得有点狠
android·android jetpack
simplepeng4 天前
Room 3.0 KMP Alpha-01
android·kotlin·android jetpack