Jetpack Compose 常用控件
- 一、基礎展示控件:呈現靜態內容
- 二、交互控件:響應用戶操作
- 三、列表與網格控件:展示大量數據
- 四、導航與標簽控件:組織頁面結構
- 五、反饋控件:提示與加載狀態
- 六、布局控件:組織 UI 結構
- 七、自定義控件:擴展現有功能
- 總結
Jetpack Compose
作為
Android
官方推薦的現代
UI
框架,以聲明式編程為核心,提供了豐富的控件體系。這些控件不僅覆蓋了傳統
View
系統的所有功能,還通過可組合性、狀態驅動等特性簡化了開發流程。本文將系統梳理
Compose
中的核心控件,從基礎展示到復雜交互,助你全面掌握
UI
開發利器。
一、基礎展示控件:呈現靜態內容
基礎展示控件用于顯示文本、圖片等靜態內容,是構建 UI
的 “原子單元”。
Text
:文本展示
Text
是最基礎的控件,用于顯示字符串,支持豐富的樣式配置。
@Preview
@Composable
fun TextExamples() {Column(modifier = Modifier.padding(16.dp).background(Color.White)) {// 基礎文本Text("基礎文本")// 帶樣式的文本Text(text = "大號粗體文本",fontSize = 20.sp,fontWeight = FontWeight.Bold,color = Color.Blue)// 多行文本與換行Text(text = "這是一段很長的文本,會自動換行顯示。Compose的Text控件默認支持多行文本,無需額外配置。",maxLines = 2, // 限制最大行數overflow = TextOverflow.Ellipsis, // 超出部分顯示省略號modifier = Modifier.width(200.dp))// 帶點擊事件的文本Text(text = "可點擊文本",modifier = Modifier.clickable { println("文本被點擊") }.padding(8.dp),color = Color.Red)}
}
核心屬性:fontSize
(字體大小)、fontWeight
(字重)、color
(顏色)、maxLines
(最大行數)、textAlign
(對齊方式)。
Image
:圖片展示
Image
用于顯示本地資源、網絡圖片或內存中的圖像,配合painter
指定圖片源。
@Preview
@Composable
fun ImageExamples() {Column(modifier = Modifier.padding(16.dp)) {// 本地資源圖片(res/drawable目錄下)Image(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "應用Logo", // 無障礙描述(必傳)modifier = Modifier.size(100.dp))// 網絡圖片(需配合Coil等庫)AsyncImage(model = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png",contentDescription = "baidu",modifier = Modifier.size(100.dp),contentScale = ContentScale.Crop // 裁剪填充)// 圓形圖片(配合clip修飾符)Image(painter = painterResource(id = R.drawable.btn_bg),contentDescription = "圓形頭像",modifier = Modifier.size(80.dp).clip(CircleShape), // 圓形裁剪contentScale = ContentScale.Fit)}
}
注意:網絡圖片需添加 coil-compose
依賴;contentDescription
用于無障礙服務,不可省略(純裝飾性圖片可傳 null
,但需顯式聲明)。
Icon
:圖標展示
Icon
專門用于顯示矢量圖標(如Material Icons
),體積小且支持無損縮放。
@Preview
@Composable
fun IconExamples() {Row(Modifier.background(Color.White),horizontalArrangement = Arrangement.spacedBy(16.dp)) {// Material內置圖標Icon(imageVector = Icons.Default.Home,contentDescription = "首頁",tint = Color.Blue, // 圖標顏色modifier = Modifier.size(24.dp))// 自定義矢量圖標(res/drawable目錄下的xml矢量圖)Icon(painter = painterResource(id = R.drawable.ic_launcher_foreground),contentDescription = "自定義圖標",modifier = Modifier.size(32.dp))}
}
常用場景:導航欄、按鈕、狀態指示等,常與 IconButton
結合實現點擊交互。
二、交互控件:響應用戶操作
交互控件是用戶與 APP 交互的核心,包括按鈕、開關、滑塊等,需配合狀態管理實現動態反饋。
Button
:按鈕
Button
是最常用的交互控件,支持點擊事件、文本 + 圖標組合、樣式定制。
@Preview
@Composable
fun ButtonExamples() {Column(Modifier.background(Color.White),verticalArrangement = Arrangement.spacedBy(8.dp)) {// 基礎按鈕Button(onClick = { println("基礎按鈕點擊") }) {Text("確定")}// 帶圖標的按鈕Button(onClick = { /* 點擊事件 */ }) {Icon(imageVector = Icons.Default.Settings,contentDescription = null,modifier = Modifier.size(ButtonDefaults.IconSize))Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) // 圖標與文本間距Text("設置")}// 文本按鈕(無背景,僅文本樣式)TextButton(onClick = { /* 點擊事件 */ }) {Text("取消")}// 圖標按鈕(圓形,常用于工具欄)IconButton(onClick = { /* 點擊事件 */ }) {Icon(imageVector = Icons.Default.Menu,contentDescription = "菜單")}// 禁用狀態Button(onClick = { /* 點擊事件 */ },enabled = false // 禁用按鈕) {Text("禁用按鈕")}}
}
擴展:通過 shape
(形狀)、colors
(顏色)、elevation
(陰影)自定義按鈕樣式,或使用 OutlinedButton
(描邊按鈕)。
- 選擇控件:
Checkbox
、RadioButton
、Switch
這類控件用于接收用戶的選擇輸入,通常與mutableStateOf
綁定狀態。
@Preview
@Composable
fun SelectionControls() {Column(modifier = Modifier.padding(16.dp).background(Color.White)) {// 復選框(可多選)var checked by remember { mutableStateOf(false) }Row(verticalAlignment = Alignment.CenterVertically) {Checkbox(checked = checked,onCheckedChange = { checked = it })Text("同意條款", modifier = Modifier.clickable { checked = !checked })}// 單選按鈕(需配合RadioGroup邏輯)val options = listOf("選項1", "選項2", "選項3")var selectedOption by remember { mutableStateOf(options[0]) }options.forEach { option ->Row(verticalAlignment = Alignment.CenterVertically) {RadioButton(selected = selectedOption == option,onClick = { selectedOption = option })Text(option, modifier = Modifier.clickable { selectedOption = option })}}// 開關(類似復選框,常用于啟用/禁用功能)var switchChecked by remember { mutableStateOf(false) }Row(verticalAlignment = Alignment.CenterVertically) {Text("開啟通知")Switch(checked = switchChecked,onCheckedChange = { switchChecked = it })}}
}
注意:單選按鈕需手動實現 “互斥” 邏輯(選中一個時取消其他);所有選擇控件的狀態需用 remember
存儲以觸發重組。
- 輸入控件:
TextField
TextField
用于接收用戶文本輸入(如登錄、搜索),支持單行 / 多行、提示文本、輸入驗證等。
@Preview
@Composable
fun TextFieldExamples() {Column(modifier = Modifier.padding(16.dp)) {// 基礎輸入框var text by remember { mutableStateOf("") }TextField(value = text,onValueChange = { text = it },label = { Text("請輸入內容") }, // 提示標簽(聚焦時上移)modifier = Modifier.fillMaxWidth())// 密碼輸入框var password by remember { mutableStateOf("") }TextField(value = password,onValueChange = { password = it },label = { Text("密碼") },visualTransformation = PasswordVisualTransformation(), // 密碼隱藏singleLine = true, // 單行輸入(避免軟鍵盤換行)modifier = Modifier.fillMaxWidth())// 多行輸入框(如備注)var note by remember { mutableStateOf("") }TextField(value = note,onValueChange = { note = it },label = { Text("備注") },maxLines = 3, // 最大3行modifier = Modifier.fillMaxWidth())}
}
進階:通過 keyboardOptions
指定鍵盤類型(如 KeyboardType.Number
),isError
顯示錯誤狀態,leadingIcon
添加前綴圖標。
- 其他交互控件
Slider
:滑動條,用于選擇范圍內的數值(如音量調節):
@Preview
@Composable
fun SliderExample(){var sliderValue by remember { mutableStateOf(0f) }Slider(value = sliderValue,onValueChange = { sliderValue = it },valueRange = 0f..100f // 取值范圍)
}
DropdownMenu
:下拉菜單,點擊按鈕時顯示選項列表:
@Preview
@Composable
fun DropDownMenuExample() {var expanded by remember { mutableStateOf(false) }Box {Button(onClick = { expanded = true }) { Text("選擇選項") }DropdownMenu(expanded = expanded,onDismissRequest = { expanded = false }) {DropdownMenuItem(text = { Text("選項1") }, onClick = { expanded = false })DropdownMenuItem(text = { Text("選項2") }, onClick = { expanded = false })}}
}
三、列表與網格控件:展示大量數據
當需要展示多條數據(如聯系人、商品列表)時,使用列表 / 網格控件,它們通過 “懶加載” 提升性能。
LazyColumn
:垂直滾動列表
LazyColumn
僅渲染可見項,適合大量數據,類似傳統RecyclerView
。
@Preview
@Composable
fun LazyColumnExample() {val items = List(100) { "列表項 $it" } // 模擬100條數據LazyColumn(modifier = Modifier.fillMaxSize(),contentPadding = PaddingValues(16.dp), // 列表內邊距verticalArrangement = Arrangement.spacedBy(8.dp) // 項間距) {// 頭部item {Text("列表標題", fontSize = 20.sp, fontWeight = FontWeight.Bold)Spacer(modifier = Modifier.height(16.dp))}// 數據項items(items) { itemText ->Box(modifier = Modifier.fillMaxWidth().height(60.dp).background(Color.LightGray).padding(16.dp)) {Text(text = itemText)}}// 底部item {Spacer(modifier = Modifier.height(16.dp))Text("列表底部", color = Color.Gray)}}
}
核心 API:item
(單個項)、items
(批量項)、itemsIndexed
(帶索引的批量項)。
LazyRow
:水平滾動列表
與LazyColumn
邏輯一致,用于水平方向的滾動列表(如圖片輪播)。
@Preview
@Composable
fun LazyRowExample() {LazyRow(modifier = Modifier.height(120.dp),contentPadding = PaddingValues(16.dp),horizontalArrangement = Arrangement.spacedBy(16.dp)) {items(20) { index ->Box(modifier = Modifier.width(100.dp).fillMaxHeight().background(Color(0xFF6200EE)),contentAlignment = Alignment.Center) {Text(text = "Item $index", color = Color.White)}}}
}
LazyVerticalGrid
:垂直網格
用于展示多行多列的網格布局(如相冊、商品列表)。
@Preview
@Composable
fun LazyGridExample() {LazyVerticalGrid(columns = GridCells.Fixed(2), // 固定2列modifier = Modifier.fillMaxSize(),contentPadding = PaddingValues(16.dp),horizontalArrangement = Arrangement.spacedBy(16.dp),verticalArrangement = Arrangement.spacedBy(16.dp)) {items(20) { index ->Box(modifier = Modifier.aspectRatio(1f) // 正方形.background(Color.LightGray),contentAlignment = Alignment.Center) {Text(text = "Item $index")}}}
}
列數配置:GridCells.Fixed(n)
(固定 n
列)、GridCells.Adaptive(minSize)
(自適應列數,每列至少minSize
寬度)。
四、導航與標簽控件:組織頁面結構
這類控件用于實現頁面導航、內容分類,是多頁面 APP
的核心組件。
TabRow
與Tab
:標簽頁
TabRow
配合Tab
實現標簽切換(如 “推薦”“熱門” 標簽)。
@Preview
@Composable
fun TabExample() {val tabs = listOf("首頁", "設置", "我的")var selectedTabIndex by remember { mutableStateOf(0) }Column(modifier = Modifier.fillMaxSize().background(Color.White)) {// 標簽欄TabRow(selectedTabIndex = selectedTabIndex) {tabs.forEachIndexed { index, title ->Tab(selected = selectedTabIndex == index,onClick = { selectedTabIndex = index },text = { Text(title) },icon = {Icon(imageVector = when (index) {0 -> Icons.Default.Home1 -> Icons.Default.Settingselse -> Icons.Default.Person},contentDescription = title)})}}// 標簽內容when (selectedTabIndex) {0 -> Text("首頁內容", modifier = Modifier.padding(16.dp))1 -> Text("設置內容", modifier = Modifier.padding(16.dp))2 -> Text("我的內容", modifier = Modifier.padding(16.dp))}}
}
Navigation
組件:頁面導航
配合Jetpack Navigation
庫實現頁面間跳轉,通過NavHost
和composable
定義路由。
// 首頁
@Composable
fun HomeScreen(onNavigateToDetail: () -> Unit) {Button(onClick = onNavigateToDetail) { Text("去詳情頁") }
}// 詳情頁
@Composable
fun DetailScreen(onNavigateBack: () -> Unit) {Button(onClick = onNavigateBack) { Text("返回首頁") }
}@Preview
@Composable
fun NavigationExample() {val navController = rememberNavController()NavHost(navController = navController,startDestination = "home" // 初始頁面) {composable("home") {HomeScreen(onNavigateToDetail = { navController.navigate("detail") })}composable("detail") {DetailScreen(onNavigateBack = { navController.popBackStack() })}}
}
五、反饋控件:提示與加載狀態
用于向用戶反饋操作結果、加載狀態或錯誤信息。
- 進度指示器:
CircularProgressIndicator
、LinearProgressIndicator
顯示操作進度(如網絡請求、文件下載)。
@Composable
fun ProgressIndicators() {Column(horizontalAlignment = Alignment.CenterHorizontally) {// 圓形進度條(無限循環)CircularProgressIndicator(modifier = Modifier.size(40.dp),color = Color.Blue,strokeWidth = 4.dp)Spacer(modifier = Modifier.height(16.dp))// 線性進度條(指定進度)var progress by remember { mutableStateOf(0.3f) }LinearProgressIndicator(progress = progress,modifier = Modifier.fillMaxWidth(0.5f),color = Color.Green)}
}
- 對話框:
AlertDialog
、BottomSheetDialog
用于重要操作確認、信息提示或復雜輸入。
@OptIn(ExperimentalMaterial3Api::class)
@Preview
@Composable
fun DialogExamples() {var showAlert by remember { mutableStateOf(false) }var showBottomSheet by remember { mutableStateOf(false) }Column {Button(onClick = { showAlert = true }) { Text("顯示對話框") }Button(onClick = { showBottomSheet = true }) { Text("顯示底部彈窗") }}// AlertDialog(居中彈窗)if (showAlert) {AlertDialog(onDismissRequest = { showAlert = false }, // 點擊外部關閉title = { Text("提示") },text = { Text("確定要執行此操作嗎?") },confirmButton = {Button(onClick = { showAlert = false }) { Text("確定") }},dismissButton = {TextButton(onClick = { showAlert = false }) { Text("取消") }})}// 底部彈窗if (showBottomSheet) {ModalBottomSheet(onDismissRequest = { showBottomSheet = false }) {Column(modifier = Modifier.padding(16.dp)) {Text("底部彈窗內容", fontSize = 18.sp)Spacer(modifier = Modifier.height(16.dp))Button(onClick = { showBottomSheet = false }) { Text("關閉") }}}}
}
Snackbar
:輕量提示
用于顯示短暫的操作反饋(如 “保存成功”),通常與Scaffold
配合使用。
@Preview
@Composable
fun SnackbarExample() {val snackbarHostState = remember { SnackbarHostState() }val scope = rememberCoroutineScope()Scaffold(snackbarHost = {SnackbarHost(snackbarHostState) { data ->Snackbar {// The Material spec recommends a maximum of 2 lines of text.Text(data.visuals.message, maxLines = 2, overflow = TextOverflow.Ellipsis)}}},floatingActionButton = {ExtendedFloatingActionButton(onClick = {scope.launch {val longMessage ="Very very very very very very very very very very very very very " +"very very very very very very very very very very very very " +"very very very very very very very very very very long message"snackbarHostState.showSnackbar(longMessage)}}) {Text("Show snackbar")}},content = { innerPadding ->Text(text = "Multiline Snackbar Demo",modifier = Modifier.padding(innerPadding).fillMaxSize().wrapContentSize())})
}
六、布局控件:組織 UI 結構
布局控件用于排列子組件,是構建復雜 UI 的基礎(前文布局博客已詳細介紹,此處簡要回顧核心控件):
Column
:垂直排列子組件;
Row
:水平排列子組件;
Box
:層疊或定位子組件;
ConstraintLayout
:通過約束關系排列子組件;
FlowRow
/FlowColumn
:自動換行的流式布局。
七、自定義控件:擴展現有功能
當現有控件無法滿足需求時,可通過組合現有控件或使用 Layout 函數創建自定義控件。
示例:自定義星級評分控件
@Composable
fun RatingBar(rating: Int,maxRating: Int = 5,onRatingChanged: (Int) -> Unit,starSize: Dp = 24.dp
) {Row {repeat(maxRating) { index ->Icon(imageVector =Icons.Default.Star,contentDescription = "評分 $index",tint = if (index < rating) Color.Yellowelse Color.Gray,modifier = Modifier.size(starSize).clickable { onRatingChanged(index + 1) })}}
}@Preview
@Composable
fun UseRatingBar() {var rating by remember { mutableStateOf(3) }RatingBar(rating = rating,onRatingChanged = { rating = it })
}
總結
Jetpack Compose
的控件體系以 “可組合性” 為核心,從基礎的 Text
、Button
到復雜的 LazyColumn
、NavHost
,覆蓋了 Android
開發的所有 UI
場景。與傳統 View
相比,Compose
控件具有以下優勢:
聲明式語法:直接描述 UI
狀態,無需手動更新視圖;
狀態驅動:通過 remember
、mutableStateOf
等 API
實現狀態與 UI
的自動同步;
靈活組合:任何控件都可作為子組件組合,輕松構建復雜 UI
;
Material Design 3
原生支持:內置符合現代設計規范的組件,無需額外適配。
掌握這些控件后,你可以快速構建出美觀、高效、易維護的 Android
應用。實際開發中,建議結合官方文檔和具體場景,選擇最合適的控件組合,以實現最佳的用戶體驗。