เลย์เอาต์ที่ถูกต้องตามหลักของแผงสนับสนุนจะดึงดูดความสนใจของผู้ใช้ไปยังเนื้อหาหลักของแอป ในขณะเดียวกันก็แสดงเนื้อหาสนับสนุนที่เกี่ยวข้องด้วย ตัวอย่างเช่น แผงเนื้อหาหลักอาจแสดงข้อมูลเกี่ยวกับภาพยนตร์ล่าสุด ส่วนแผงสนับสนุนจะแสดงรายการภาพยนตร์อื่นๆ ที่มีธีมคล้ายกัน หรือผู้กำกับหรือนักแสดงนำคนเดียวกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับเลย์เอาต์ที่ถูกต้องของแผงสนับสนุนได้ที่หลักเกณฑ์เกี่ยวกับแผงสนับสนุนของ Material 3
ใช้แผงสนับสนุน
SupportingPaneScaffold
ประกอบด้วยแผงสูงสุด 3 แผง ได้แก่ แผงหลัก แผงสนับสนุน และแผงเพิ่มเติมที่ไม่บังคับ โครงสร้างชั่วคราวจะจัดการการคํานวณทั้งหมดเพื่อจัดสรรพื้นที่หน้าต่างให้กับ 3 แผง ในหน้าจอขนาดใหญ่ นั่งร้านจะแสดงแผงหลักโดยมีแผงรองรับอยู่ด้านข้าง ในหน้าจอขนาดเล็ก โครงสร้างชั่วคราวจะแสดงแผงหลักหรือแผงสนับสนุนแบบเต็มหน้าจอ
เพิ่มการพึ่งพา
SupportingPaneScaffold
เป็นส่วนหนึ่งของไลบรารีเลย์เอาต์แบบปรับเปลี่ยนได้ของ Material 3
เพิ่มทรัพยากร Dependency ที่เกี่ยวข้อง 3 รายการต่อไปนี้ลงในไฟล์ build.gradle
ของแอปหรือโมดูล
Kotlin
implementation("androidx.compose.material3.adaptive:adaptive") implementation("androidx.compose.material3.adaptive:adaptive-layout") implementation("androidx.compose.material3.adaptive:adaptive-navigation")
Groovy
implementation 'androidx.compose.material3.adaptive:adaptive' implementation 'androidx.compose.material3.adaptive:adaptive-layout' implementation 'androidx.compose.material3.adaptive:adaptive-navigation'
- ปรับเปลี่ยนได้ — องค์ประกอบพื้นฐานระดับล่าง เช่น
HingeInfo
และPosture
- adaptive-layout — เลย์เอาต์แบบปรับขนาดได้ เช่น
SupportingPaneScaffold
- การนำทางแบบปรับเปลี่ยนได้ — Composable สำหรับการนำทางภายในและระหว่างบานหน้าต่าง
สร้างเครื่องมือนำทางและโครงสร้างพื้นฐาน
ในหน้าต่างขนาดเล็ก ระบบจะแสดงแผงเพียงแผงเดียวในแต่ละครั้ง ดังนั้นให้ใช้แป้น ThreePaneScaffoldNavigator
เพื่อไปยังแผงต่างๆ สร้างอินสแตนซ์ของตัวนำทางด้วย rememberSupportingPaneScaffoldNavigator
หากต้องการจัดการท่าทางสัมผัส "กลับ" ให้ใช้ BackHandler
ที่ตรวจสอบ
canNavigateBack()
และเรียกใช้
navigateBack()
val navigator = rememberSupportingPaneScaffoldNavigator() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() }
โครงสร้างพื้นฐานต้องมี PaneScaffoldDirective
ซึ่งควบคุมวิธีแบ่งหน้าจอและระยะห่างที่จะใช้ และ ThreePaneScaffoldValue
ซึ่งระบุสถานะปัจจุบันของแผง (เช่น ขยายหรือซ่อนอยู่) สําหรับลักษณะการทํางานเริ่มต้น ให้ใช้ scaffoldDirective
และ scaffoldValue
ของ Navigator ตามลําดับ
SupportingPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, mainPane = { /*...*/ }, supportingPane = { /*...*/ }, )
แผงหลักและแผงสนับสนุนคือคอมโพสิเบิลที่มีเนื้อหาของคุณ ใช้ AnimatedPane
เพื่อใช้ภาพเคลื่อนไหวของแผงเริ่มต้นระหว่างการไปยังส่วนต่างๆ ใช้ค่านั่งร้านเพื่อตรวจสอบว่าแผงรองรับซ่อนอยู่หรือไม่ หากเป็นเช่นนั้น ให้แสดงปุ่มที่จะเรียกใช้ navigateTo(ThreePaneScaffoldRole.Secondary)
เพื่อแสดงแผงสนับสนุน
ต่อไปนี้คือการใช้งานโครงข่ายอย่างเต็มรูปแบบ
val navigator = rememberSupportingPaneScaffoldNavigator() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() } SupportingPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, mainPane = { AnimatedPane(modifier = Modifier.safeContentPadding()) { // Main pane content if (navigator.scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Hidden) { Button( modifier = Modifier.wrapContentSize(), onClick = { navigator.navigateTo(SupportingPaneScaffoldRole.Supporting) } ) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } }, supportingPane = { AnimatedPane(modifier = Modifier.safeContentPadding()) { // Supporting pane content Text("Supporting pane") } }, )
ดึงข้อมูลคอมโพเนนต์ของแผง
แยกแผงของ SupportingPaneScaffold
แต่ละรายการลงใน Composable ของแต่ละแผงเพื่อให้นำมาใช้ซ้ำและทดสอบได้ ใช้ ThreePaneScaffoldScope
เพื่อเข้าถึง AnimatedPane
หากต้องการภาพเคลื่อนไหวเริ่มต้น
@Composable fun ThreePaneScaffoldScope.MainPane( shouldShowSupportingPaneButton: Boolean, onNavigateToSupportingPane: () -> Unit, modifier: Modifier = Modifier, ) { AnimatedPane(modifier = modifier.safeContentPadding()) { // Main pane content if (shouldShowSupportingPaneButton) { Button(onClick = onNavigateToSupportingPane) { Text("Show supporting pane") } } else { Text("Supporting pane is shown") } } } @Composable fun ThreePaneScaffoldScope.SupportingPane( modifier: Modifier = Modifier, ) { AnimatedPane(modifier = modifier.safeContentPadding()) { // Supporting pane content Text("This is the supporting pane") } }
การสกัดแผงออกเป็นคอมโพสิเบิลช่วยให้การใช้ SupportingPaneScaffold
ง่ายขึ้น (เปรียบเทียบการดำเนินการต่อไปนี้กับการใช้งานสแคฟเฟิลด์อย่างสมบูรณ์ในส่วนก่อนหน้า)
val navigator = rememberSupportingPaneScaffoldNavigator() BackHandler(navigator.canNavigateBack()) { navigator.navigateBack() } SupportingPaneScaffold( directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, mainPane = { MainPane( shouldShowSupportingPaneButton = navigator.scaffoldValue.secondary == PaneAdaptedValue.Hidden, onNavigateToSupportingPane = { navigator.navigateTo(ThreePaneScaffoldRole.Secondary) } ) }, supportingPane = { SupportingPane() }, )