สร้างเลย์เอาต์แผงรองรับ

เลย์เอาต์ที่ถูกต้องตามหลักของแผงสนับสนุนจะดึงดูดความสนใจของผู้ใช้ไปยังเนื้อหาหลักของแอป ในขณะเดียวกันก็แสดงเนื้อหาสนับสนุนที่เกี่ยวข้องด้วย ตัวอย่างเช่น แผงเนื้อหาหลักอาจแสดงข้อมูลเกี่ยวกับภาพยนตร์ล่าสุด ส่วนแผงสนับสนุนจะแสดงรายการภาพยนตร์อื่นๆ ที่มีธีมคล้ายกัน หรือผู้กำกับหรือนักแสดงนำคนเดียวกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับเลย์เอาต์ที่ถูกต้องของแผงสนับสนุนได้ที่หลักเกณฑ์เกี่ยวกับแผงสนับสนุนของ Material 3

ใช้แผงสนับสนุน

SupportingPaneScaffold ประกอบด้วยแผงสูงสุด 3 แผง ได้แก่ แผงหลัก แผงสนับสนุน และแผงเพิ่มเติมที่ไม่บังคับ โครงสร้างชั่วคราวจะจัดการการคํานวณทั้งหมดเพื่อจัดสรรพื้นที่หน้าต่างให้กับ 3 แผง ในหน้าจอขนาดใหญ่ นั่งร้านจะแสดงแผงหลักโดยมีแผงรองรับอยู่ด้านข้าง ในหน้าจอขนาดเล็ก โครงสร้างชั่วคราวจะแสดงแผงหลักหรือแผงสนับสนุนแบบเต็มหน้าจอ

เนื้อหาหลักแสดงบนพื้นที่ส่วนใหญ่ของหน้าจอโดยมีเนื้อหาสนับสนุนอยู่ด้านข้าง
รูปที่ 1 เลย์เอาต์แผงที่รองรับ

เพิ่มการพึ่งพา

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() },
)