Jetpack Compose 是谷歌推出的现代化 UI 框架,用于简化 Android 应用开发中的 UI 构建。它使用声明式编程方式,允许开发者以简洁直观的方式创建动态和响应式的 UI。本文将从基础概念到进阶用法,带你全面了解 Compose 的核心功能和使用技巧。
基本组件使用
1. Text 组件
Text 组件用于在界面上显示文本。其使用非常简单,只需在可组合函数中调用 Text 并传入要显示的文本内容即可
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable@Composable
fun SimpleTextUI() {Column {Text("这是 Compose 中的一段文本")}
}
这里创建了一个名为 SimpleTextUI 的可组合函数,内部使用 Column 组件垂直排列子组件,并在其中添加了一个 Text 组件来显示指定文本。
2. Button 组件
Button 组件用于创建可点击的按钮。通常与点击事件处理结合使用
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember@Composable
fun ButtonUI() {val clickCount = remember { mutableStateOf(0) }Column {Button(onClick = { clickCount.value++ }) {Text("点击我")}Text("按钮已被点击 ${clickCount.value} 次")}
}
在这个例子中,通过 remember 和 mutableStateOf 来创建并记住一个可观察的点击次数状态。每次点击按钮时,点击次数会增加,并在下方的 Text 组件中实时显示更新后的点击次数
3. 布局组件 Column 和 Row
Column 用于垂直排列子组件,Row 用于水平排列子组件。它们是构建复杂 UI 布局的基础。例如,创建一个简单的登录界面布局
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material.TextField
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable@Composable
fun LoginUI() {Column {TextField(value = "", onValueChange = {})TextField(value = "", onValueChange = {})Row {Button(onClick = {}) {Text("登录")}Button(onClick = {}) {Text("注册")}}}
}
在 LoginUI 函数中,首先使用 Column 垂直排列两个 TextField 组件用于输入用户名和密码,然后使用 Row 水平排列登录和注册按钮
4. 状态管理
在 Compose 中,状态管理是构建动态 UI 的关键。常用的方式是结合 remember 和 mutableStateOf。例如,实现一个简单的计数器应用
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp@Composable
fun CounterApp() {val count = remember { mutableStateOf(0) }Column(modifier = Modifier.fillMaxWidth(),horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Center) {Text(text = "计数: ${count.value}")Spacer(modifier = Modifier.height(16.dp))Row(modifier = Modifier.fillMaxWidth(),horizontalArrangement = Arrangement.Center) {Button(onClick = { count.value = count.value - 1 }) {Text(text = "减少")}Spacer(modifier = Modifier.width(16.dp))Button(onClick = { count.value = count.value + 1 }) {Text(text = "增加")}}}
}
这里通过 remember {mutableStateOf (0) } 创建了一个可记忆的计数器状态 count。当点击增加或减少按钮时,count.value 会相应改变,从而触发包含 Text 组件的 Column 组件重组,更新界面显示的计数
5. 主题和样式
Compose 提供了强大的主题系统来统一应用的外观。首先可以定义自己的主题颜色等属性
import androidx.compose.material.MaterialTheme
import androidx.compose.material.lightColors
import androidx.compose.runtime.Composableval MyColors = lightColors(primary = Color.Blue,secondary = Color.Green
)@Composable
fun MyAppTheme(content: @Composable () -> Unit) {MaterialTheme(colors = MyColors,content = content)
}
然后在其他组件中应用这个主题:
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable@Composable
fun ThemedText() {MyAppTheme {Column {Text("这段文本在自定义主题中", color = MaterialTheme.colors.primary)}}
}
这样就可以使文本的颜色根据自定义主题中的主颜色来显示,实现了整个应用 UI 风格的统一和定制
6. 与其他组件集成 与 ViewModel 集成
在遵循 MVVM 架构的 Android 应用中,Compose 可以与 ViewModel 无缝协作。例如,假设有一个 UserViewModel 用于获取和管理用户信息
class UserViewModel : ViewModel() {val user = MutableLiveData<User>()// 假设这里有方法来获取用户信息,如从网络或者数据库fun fetchUser() {//...}
}
在 Compose 中使用如下:
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.compose.viewModel@Composable
fun UserInfoUI() {val viewModel: UserViewModel = viewModel()viewModel.fetchUser()val user = viewModel.user.valueColumn {if (user!= null) {Text("用户名: ${user.name}")Text("用户年龄: ${user.age}")}}
}
通过 viewModel 函数获取 UserViewModel 的实例,调用 fetchUser 方法获取用户信息,并在 UI 中显示用户的姓名和年龄。
7. 与导航(Navigation)集成
Compose 可以与 Android 的导航组件集成,实现不同屏幕之间的导航。例如,定义两个 Compose 屏幕 ScreenA 和 ScreenB 并设置导航:
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController@Composable
fun ScreenA(navController: NavController) {Column {Text("这是屏幕 A")Button(onClick = { navController.navigate("screenB") }) {Text("前往屏幕 B")}}
}@Composable
fun ScreenB() {Column {Text("这是屏幕 B")}
}@Composable
fun NavigationApp() {val navController = rememberNavController()NavHost(navController = navController,startDestination = "screenA") {composable("screenA") {ScreenA(navController)}composable("screenB") {ScreenB()}}
}
这里 NavigationApp 函数是导航应用的入口。通过 rememberNavController 创建导航控制器,NavHost 定义导航宿主,composable 函数定义不同屏幕及其对应的路径。在 ScreenA 中点击按钮可通过导航控制器导航到 ScreenB