Android Jetpack Compose 从入门到精通

简介: Jetpack Compose 是 Google 推出的现代化 Android 声明式 UI 工具包,基于 Kotlin,简化传统 XML 开发。本教程系统讲解其核心概念:可组合函数、状态管理、布局系统、Modifier 修饰符、列表滚动、主题样式、导航与动画等,涵盖从入门到高级技巧,助你高效构建高性能、可复用的 Android 界面。

@TOC

概述

Jetpack Compose 是 Google 推出的现代化 Android 声明式 UI 工具包,使用 Kotlin 语言构建,彻底改变了传统基于 XML 的 UI 开发方式。它以 声明式函数式响应式 的方式编写界面,让 UI 开发更简洁、高效、可组合。

本教程带你从零开始,系统掌握 Compose 的核心概念与高级技巧。


一、为什么选择 Jetpack Compose?

传统 View 系统的痛点

  • XML 与 Java/Kotlin 分离,维护困难
  • 布局嵌套深,性能差
  • 代码冗长,难以复用
  • 动画实现复杂

Compose 的优势

声明式 UI:描述“UI 应该是什么样”,而非“如何构建 UI”
Kotlin First:纯 Kotlin 编写,充分利用语言特性
可组合函数:小部件自由组合,高度可复用
实时预览:Android Studio 支持 @Preview 注解,无需运行 App
响应式:状态变化自动更新 UI
性能优秀:智能重组(Recomposition),减少不必要的绘制


二、核心概念

1. 可组合函数(@Composable)

所有 UI 组件都是用 @Composable 注解的函数。

@Composable
fun Greeting(name: String) {
    Text(text = "Hello, $name!")
}

2. 声明式 UI

传统方式(命令式):


val textView = findViewById<TextView>(R.id.text)
textView.text = "Hello"

Compose 方式(声明式):


Text(text = "Hello")

你声明 UI 的状态,Compose 负责更新。

3. 状态与重组(State & Recomposition)

当状态变化时,Compose 会自动重新调用可组合函数(重组)。


@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }

    Button(onClick = { count++ }) {
        Text("Clicked $count times")
    }
}

remember:在重组期间保留状态
mutableStateOf:创建可观察状态,变化时触发重组
推荐使用 ViewModel 管理 UI 状态:


@Composable
fun Counter(viewModel: CounterViewModel) {
    val count by viewModel.count.collectAsState()

    Button(onClick = { viewModel.increment() }) {
        Text("Clicked $count times")
    }
}

三、基础 UI 组件

1. Text


Text(
    text = "Hello Compose",
    fontSize = 24.sp,
    fontWeight = FontWeight.Bold,
    color = Color.Blue
)

2. Image


Image(
    painter = painterResource(R.drawable.ic_logo),
    contentDescription = "Logo",
    contentScale = ContentScale.Fit
)

3. Button


Button(onClick = { /* handle click */ }) {
    Text("Click Me")
}

4. TextField


var text by remember { mutableStateOf("") }
TextField(
    value = text,
    onValueChange = { text = it },
    label = { Text("Enter text") }
)

四、布局系统(Layouts)

Compose 提供了强大的布局容器。

1. Column(垂直排列)


Column(
    modifier = Modifier.padding(16.dp),
    verticalArrangement = Arrangement.Center,
    horizontalAlignment = Alignment.CenterHorizontally
) {
    Text("Item 1")
    Text("Item 2")
    Button(onClick = {}) { Text("OK") }
}

2. Row(水平排列)


Row(
    horizontalArrangement = Arrangement.SpaceBetween,
    verticalAlignment = Alignment.CenterVertically
) {
    Text("Left")
    Text("Right")
}

3. Box(层叠布局)


Box {
    Image(painter = ..., contentDescription = null)
    Text("Overlay Text", modifier = Modifier.align(Alignment.Center))
}

4. ConstraintLayout(高级约束)


ConstraintLayout {
    val (text, button) = createRefs()

    Text(
        "Hello",
        modifier = Modifier.constrainAs(text) {
            top.linkTo(parent.top)
            start.linkTo(parent.start)
        }
    )

    Button(
        onClick = { },
        modifier = Modifier.constrainAs(button) {
            bottom.linkTo(parent.bottom)
            end.linkTo(parent.end)
        }
    ) {
        Text("Click")
    }
}

需添加依赖:implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1"

五、Modifier(修饰符)

1.用法

Modifier 是 Compose 的核心设计模式,用于修饰组件的外观和行为。


Text(
    "Hello",
    modifier = Modifier
        .padding(16.dp)
        .fillMaxWidth()
        .background(Color.Gray)
        .clickable { /* handle click */ }
        .border(2.dp, Color.Black)
)

2.常用 Modifier

Modifier 作用
padding() 内边距
fillMaxWidth() / fillMaxHeight() 填充父容器
size(width, height) 设置大小
background() 背景颜色或形状
clickable { } 点击事件
border() 边框
clip() 裁剪形状(如 RoundedCornerShape(8.dp))

顺序很重要!padding().background() 与 background().padding() 效果不同。

六、列表与滚动

1. LazyColumn(垂直滚动列表)


@Composable
fun MessageList(messages: List<String>) {
    LazyColumn {
        items(messages) { message ->
            MessageItem(message)
        }
    }
}

2. LazyRow(水平滚动)


LazyRow {
    items(10) { index ->
        Chip(text = "Item $index")
    }
}

Lazy 前缀表示“懒加载”,只渲染可见项,性能优秀。

七、主题与样式

1.Compose 内置 Material Design 3 主题。


MaterialTheme(
    colorScheme = ColorScheme.Light(
        primary = Color.Blue,
        secondary = Color.Green
    ),
    typography = Typography(
        bodyLarge = TextStyle(fontSize = 18.sp)
    ),
    shapes = Shapes(
        medium = RoundedCornerShape(8.dp)
    )
) {
    // Your UI here
    Greeting("Android")
}

2.使用主题属性:


Text(
    "Themed Text",
    style = MaterialTheme.typography.headlineMedium,
    color = MaterialTheme.colorScheme.primary
)

八、导航(Navigation)

使用 Navigation Component + Compose。

1. 添加依赖


implementation "androidx.navigation:navigation-compose:2.7.6"

2. 定义导航图


@Composable
fun NavGraph() {
    val navController = rememberNavController()

    NavHost(navController = navController, startDestination = "home") {
        composable("home") { HomeScreen() }
        composable("profile") { ProfileScreen() }
        composable("detail/{id}") { backStackEntry ->
            val id = backStackEntry.arguments?.getString("id")
            DetailScreen(id)
        }
    }
}

3. 导航跳转


// 前进
navController.navigate("profile")

// 带参数
navController.navigate("detail/123")

// 返回
navController.popBackStack()

九、副作用(Side Effects)

处理生命周期、数据加载等副作用。
| Effect | 用途 |
|----------------------|------------------------------|
| LaunchedEffect | 在作用域内启动协程 |
| DisposableEffect | 资源释放(如订阅) |
| rememberCoroutineScope | 获取协程作用域 |
| SideEffect | 将状态同步到非 Compose 代码 |


@Composable
fun MyScreen(viewModel: MyViewModel) {
    val coroutineScope = rememberCoroutineScope()

    LaunchedEffect(Unit) {
        viewModel.loadData()
    }

    DisposableEffect(key1 = "connection") {
        val connection = connect()
        onDispose { connection.disconnect() }
    }
}

十、高级技巧

1. 自定义布局(Custom Layout)


@Composable
fun MyCustomLayout(
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
) {
    Layout(
        content = content,
        modifier = modifier
    ) { measurables, constraints ->
        // 手动测量和布局子项
        layout(width, height) {
            // 放置子项
        }
    }
}

2. 动画(Animation)


var enabled by remember { mutableStateOf(true) }
val backgroundColor by animateColorAsState(
    targetValue = if (enabled) Color.Green else Color.Red,
    tween(durationMillis = 300)
)

Box(
    modifier = Modifier
        .size(100.dp)
        .background(backgroundColor)
        .clickable { enabled = !enabled }
)

3. 互操作(Interop)

在 Compose 中使用 View:


AndroidView(
    factory = { context ->
        WebView(context).apply {
            loadUrl("https://example.com")
        }
    }
)

在 Activity 中使用 Compose:


class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyAppTheme {
                Greeting("Android")
            }
        }
    }
}

十一、最佳实践

必须做:

  • 使用 ViewModel 管理 UI 状态
  • 为可组合函数添加 @Preview
  • 使用 remember 缓存计算结果
  • 避免在可组合函数中执行耗时操作
  • 合理使用 Modifier 顺序

    避免:

  • 过度嵌套布局

  • 在 @Composable 中创建对象(除非 remember)
  • 忽略 key 参数(在 items 中)
目录
相关文章
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
491 201
|
4天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
623 157
|
10天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
4天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
626 46