แถบแอปคือคอนเทนเนอร์ที่ให้สิทธิ์เข้าถึงฟีเจอร์หลักและรายการการนำทางแก่ผู้ใช้ แถบแอปมี 2 ประเภท ได้แก่ แถบแอปด้านบนและแถบแอปด้านล่าง ลักษณะที่ปรากฏและวัตถุประสงค์ของแถบแอปแต่ละประเภทมีดังนี้
ประเภท |
ลักษณะที่ปรากฏ |
วัตถุประสงค์ |
|---|---|---|
แถบแอปด้านบน |
อยู่ด้านบนสุดของหน้าจอ |
ให้สิทธิ์เข้าถึงงานและข้อมูลสำคัญ โดยทั่วไปจะแสดงชื่อ รายการการทำงานหลัก และรายการการนำทางบางรายการ |
แถบแอปด้านล่าง |
อยู่ด้านล่างสุดของหน้าจอ |
โดยทั่วไปจะมีรายการการนำทางหลัก นอกจากนี้ยังอาจให้สิทธิ์เข้าถึงการทำงานหลักอื่นๆ เช่น ผ่านปุ่มการทำงานแบบลอยที่อยู่ในแถบ |
หากต้องการใช้แถบแอปด้านบนและแถบแอปด้านล่าง ให้ใช้ฟังก์ชันที่ประกอบกันได้ TopAppBar และ
BottomAppBar ตามลำดับ ฟังก์ชันเหล่านี้ช่วยให้คุณสร้างอินเทอร์เฟซที่สอดคล้องกันซึ่งห่อหุ้มการนำทางและการควบคุมการทำงาน และสอดคล้องกับหลักการออกแบบ Material Design
แถบแอปด้านบน
ตารางต่อไปนี้แสดงแถบแอปด้านบน 4 ประเภท
ประเภท |
ตัวอย่าง |
|---|---|
เล็ก: สำหรับหน้าจอที่ไม่ต้องมีการนำทางหรือการทำงานมากนัก |
|
จัดกึ่งกลาง: สำหรับหน้าจอที่มีการทำงานหลักเพียงอย่างเดียว |
|
ปานกลาง: สำหรับหน้าจอที่ต้องมีการนำทางและการทำงานในระดับปานกลาง |
|
ใหญ่: สำหรับหน้าจอที่ต้องมีการนำทางและการทำงานจำนวนมาก |
|
แพลตฟอร์ม API
ฟังก์ชันที่ประกอบกันได้ต่างๆ ที่ช่วยให้คุณใช้แถบแอปด้านบน 4 ประเภทแตกต่างกันได้นั้นค่อนข้างคล้ายกัน โดยมีพารามิเตอร์หลักหลายรายการร่วมกัน ดังนี้
title: ข้อความที่ปรากฏในแถบแอปnavigationIcon: ไอคอนหลักสำหรับการนำทาง ปรากฏทางด้านซ้ายของแถบแอปactions: ไอคอนที่ให้สิทธิ์เข้าถึงการทำงานหลักแก่ผู้ใช้ โดยจะปรากฏทางด้านขวาของแถบแอปscrollBehavior: กำหนดวิธีที่แถบแอปด้านบนตอบสนองต่อการเลื่อนเนื้อหาภายในของ Scaffoldcolors: กำหนดลักษณะที่ปรากฏของแถบแอป
ลักษณะการทำงานของฟีเจอร์เลื่อน
คุณสามารถควบคุมวิธีที่แถบแอปตอบสนองเมื่อผู้ใช้เลื่อนเนื้อหาภายในของ Scaffold ที่กำหนด โดยสร้างอินสแตนซ์ของ
TopAppBarScrollBehavior แล้วส่งไปยังแถบแอปด้านบนสำหรับ
scrollBehavior พารามิเตอร์
TopAppBarScrollBehavior มี 3 ประเภท ดังนี้
enterAlwaysScrollBehavior: เมื่อผู้ใช้ดึงเนื้อหาภายในของ Scaffold ขึ้น แถบแอปด้านบนจะยุบ แถบแอปจะขยายเมื่อผู้ใช้เริ่มดึงเนื้อหาภายในลงexitUntilCollapsedScrollBehavior: คล้ายกับenterAlwaysScrollBehaviorแต่แถบแอปจะขยายก็ต่อเมื่อผู้ใช้ดึงเนื้อหาลงจนสุดpinnedScrollBehavior: แถบแอปจะยังคงอยู่ในตำแหน่งเดิมและไม่ตอบสนองต่อการเลื่อน
ตัวอย่างต่อไปนี้แสดงตัวเลือกเหล่านี้บางส่วน
ตัวอย่าง
ส่วนต่อไปนี้แสดงการใช้งานแถบแอปด้านบน 4 ประเภท รวมถึงตัวอย่างต่างๆ เกี่ยวกับวิธีควบคุมลักษณะการทำงานของฟีเจอร์เลื่อน
เล็ก
หากต้องการสร้างแถบแอปด้านบนขนาดเล็ก ให้ใช้ฟังก์ชันที่ประกอบกันได้ TopAppBar ตัวอย่างต่อไปนี้แสดงแถบแอปด้านบนพื้นฐานที่มีเพียงชื่อ
ตัวอย่างต่อไปนี้ไม่ได้ส่งค่าสำหรับ scrollBehavior ไปยัง TopAppBar จึงไม่ตอบสนองต่อการเลื่อนเนื้อหาภายใน
@Composable fun SmallTopAppBarExample() { Scaffold( topBar = { TopAppBar( colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.primaryContainer, titleContentColor = MaterialTheme.colorScheme.primary, ), title = { Text("Small Top App Bar") } ) }, ) { innerPadding -> ScrollContent(innerPadding) } }
การใช้งานนี้จะปรากฏดังนี้
จัดกึ่งกลาง
แถบแอปด้านบนที่จัดกึ่งกลางนั้นโดยพื้นฐานแล้วจะเหมือนกับแถบแอปขนาดเล็ก แต่ชื่อจะอยู่กึ่งกลางภายในคอมโพเนนต์ หากต้องการใช้แถบแอปประเภทนี้ ให้ใช้ฟังก์ชันที่ประกอบกันได้
โดยเฉพาะ CenterAlignedTopAppBar
ตัวอย่างนี้ใช้ enterAlwaysScrollBehavior() เพื่อรับค่าที่จะส่งสำหรับ scrollBehavior ดังนั้น แถบจะยุบเมื่อผู้ใช้เลื่อนเนื้อหาภายในของ Scaffold
@Composable fun CenterAlignedTopAppBarExample() { val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { CenterAlignedTopAppBar( colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.primaryContainer, titleContentColor = MaterialTheme.colorScheme.primary, ), title = { Text( "Centered Top App Bar", maxLines = 1, overflow = TextOverflow.Ellipsis ) }, navigationIcon = { IconButton(onClick = { /* do something */ }) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Localized description" ) } }, actions = { IconButton(onClick = { /* do something */ }) { Icon( imageVector = Icons.Filled.Menu, contentDescription = "Localized description" ) } }, scrollBehavior = scrollBehavior, ) }, ) { innerPadding -> ScrollContent(innerPadding) } }
การใช้งานนี้จะปรากฏดังนี้
ปานกลาง
แถบแอปด้านบนขนาดกลางจะวางชื่อไว้ใต้ไอคอนเพิ่มเติม หากต้องการสร้าง
แถบแอปประเภทนี้ ให้ใช้ฟังก์ชันที่ประกอบกันได้ MediumTopAppBar
ตัวอย่างนี้ใช้ enterAlwaysScrollBehavior() เพื่อรับค่าที่จะส่งสำหรับ scrollBehavior เช่นเดียวกับข้อมูลโค้ดก่อนหน้า
@Composable fun MediumTopAppBarExample() { val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState()) Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { MediumTopAppBar( colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.primaryContainer, titleContentColor = MaterialTheme.colorScheme.primary, ), title = { Text( "Medium Top App Bar", maxLines = 1, overflow = TextOverflow.Ellipsis ) }, navigationIcon = { IconButton(onClick = { /* do something */ }) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Localized description" ) } }, actions = { IconButton(onClick = { /* do something */ }) { Icon( imageVector = Icons.Filled.Menu, contentDescription = "Localized description" ) } }, scrollBehavior = scrollBehavior ) }, ) { innerPadding -> ScrollContent(innerPadding) } }
การใช้งานนี้จะปรากฏดังนี้ พร้อมการสาธิตลักษณะการทำงานของฟีเจอร์เลื่อนจาก enterAlwaysScrollBehavior()
ใหญ่
แถบแอปด้านบนขนาดใหญ่จะคล้ายกับแถบแอปขนาดกลาง แต่มีระยะห่างระหว่างชื่อกับไอคอนมากกว่าและใช้พื้นที่บนหน้าจอโดยรวมมากขึ้น หากต้องการสร้างแถบแอปประเภทนี้ ให้ใช้ฟังก์ชันที่ประกอบกันได้ LargeTopAppBar
ตัวอย่างนี้ใช้ exitUntilCollapsedScrollBehavior() เพื่อรับค่าที่จะส่งสำหรับ scrollBehavior ซึ่งแตกต่างจากข้อมูลโค้ดก่อนหน้า ดังนั้น แถบจะยุบเมื่อผู้ใช้เลื่อนเนื้อหาภายในของ Scaffold แต่จะขยายเมื่อผู้ใช้เลื่อนไปที่ส่วนท้ายของเนื้อหาภายใน
@Composable fun LargeTopAppBarExample() { val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()) Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { LargeTopAppBar( colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.primaryContainer, titleContentColor = MaterialTheme.colorScheme.primary, ), title = { Text( "Large Top App Bar", maxLines = 1, overflow = TextOverflow.Ellipsis ) }, navigationIcon = { IconButton(onClick = { /* do something */ }) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Localized description" ) } }, actions = { IconButton(onClick = { /* do something */ }) { Icon( imageVector = Icons.Filled.Menu, contentDescription = "Localized description" ) } }, scrollBehavior = scrollBehavior ) }, ) { innerPadding -> ScrollContent(innerPadding) } }
การใช้งานนี้จะปรากฏดังนี้
แถบแอปด้านล่าง
หากต้องการสร้างแถบแอปด้านล่าง ให้ใช้ฟังก์ชันที่ประกอบกันได้ BottomAppBar การใช้ฟังก์ชันที่ประกอบกันได้นี้ค่อนข้างคล้ายกับฟังก์ชันที่ประกอบกันได้ของแถบแอปด้านบนที่อธิบายไว้ในส่วนก่อนหน้าของหน้านี้ คุณส่งฟังก์ชันที่ประกอบกันได้สำหรับพารามิเตอร์หลักต่อไปนี้
actions: ชุดไอคอนที่ปรากฏทางด้านซ้ายของแถบ โดยทั่วไปจะเป็นการทำงานหลักสำหรับหน้าจอที่กำหนด หรือรายการการนำทางfloatingActionButton: ปุ่มการทำงานแบบลอยที่ปรากฏทางด้านขวาของแถบ
@Composable fun BottomAppBarExample() { Scaffold( bottomBar = { BottomAppBar( actions = { IconButton(onClick = { /* do something */ }) { Icon(Icons.Filled.Check, contentDescription = "Localized description") } IconButton(onClick = { /* do something */ }) { Icon( Icons.Filled.Edit, contentDescription = "Localized description", ) } IconButton(onClick = { /* do something */ }) { Icon( Icons.Filled.Mic, contentDescription = "Localized description", ) } IconButton(onClick = { /* do something */ }) { Icon( Icons.Filled.Image, contentDescription = "Localized description", ) } }, floatingActionButton = { FloatingActionButton( onClick = { /* do something */ }, containerColor = BottomAppBarDefaults.bottomAppBarFabColor, elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation() ) { Icon(Icons.Filled.Add, "Localized description") } } ) }, ) { innerPadding -> Text( modifier = Modifier.padding(innerPadding), text = "Example of a scaffold with a bottom app bar." ) } }
การใช้งานนี้จะปรากฏดังนี้