ลิ้นชักการนำทาง

คอมโพเนนต์ลิ้นชักการนำทางคือเมนูแบบเลื่อนเข้าที่ช่วยให้ผู้ใช้ไปยังส่วนต่างๆ ของแอปได้ โดยผู้ใช้สามารถเปิดใช้งานได้ด้วยการปัดจากด้านข้างหรือแตะไอคอนเมนู

พิจารณากรณีการใช้งาน 3 กรณีต่อไปนี้สำหรับการใช้ลิ้นชักการนำทาง

  • การจัดระเบียบเนื้อหา: ช่วยให้ผู้ใช้สลับไปมาระหว่างหมวดหมู่ต่างๆ ได้ เช่น ในแอปข่าวหรือแอปบล็อก
  • การจัดการบัญชี: แสดงลิงก์ด่วนไปยังการตั้งค่าบัญชีและส่วนโปรไฟล์ในแอปที่มีบัญชีผู้ใช้
  • การค้นพบฟีเจอร์: จัดระเบียบฟีเจอร์และการตั้งค่าหลายรายการไว้ในเมนูเดียวเพื่ออำนวยความสะดวกในการค้นพบและการเข้าถึงของผู้ใช้ในแอปที่ซับซ้อน

ใน Material Design ลิ้นชักการนำทางมี 2 ประเภท ได้แก่

  • มาตรฐาน: แชร์พื้นที่ภายในหน้าจอกับเนื้อหาอื่นๆ
  • โมดัล: ปรากฏที่ด้านบนของเนื้อหาอื่นๆ ภายในหน้าจอ
ตัวอย่างลิ้นชักการนำทางของ Material Design 3 ในโหมดสว่างและโหมดมืด
รูปที่ 1 ตัวอย่างลิ้นชักการนำทาง

ตัวอย่าง

คุณสามารถใช้ Composable ModalNavigationDrawer เพื่อใช้ลิ้นชักการนำทางได้

ใช้ช่อง drawerContent เพื่อระบุ ModalDrawerSheet และระบุเนื้อหาของลิ้นชัก ดังตัวอย่างต่อไปนี้

ModalNavigationDrawer(
    drawerContent = {
        ModalDrawerSheet {
            Text("Drawer title", modifier = Modifier.padding(16.dp))
            HorizontalDivider()
            NavigationDrawerItem(
                label = { Text(text = "Drawer Item") },
                selected = false,
                onClick = { /*TODO*/ }
            )
            // ...other drawer items
        }
    }
) {
    // Screen content
}

ModalNavigationDrawer ยอมรับพารามิเตอร์ลิ้นชักเพิ่มเติมจำนวนหนึ่ง เช่น คุณสามารถสลับว่าจะให้ลิ้นชักตอบสนองต่อการลากหรือไม่ด้วยพารามิเตอร์ gesturesEnabled ดังตัวอย่างต่อไปนี้

ModalNavigationDrawer(
    drawerContent = {
        ModalDrawerSheet {
            // Drawer contents
        }
    },
    gesturesEnabled = false
) {
    // Screen content
}

ควบคุมลักษณะการทำงาน

หากต้องการควบคุมวิธีเปิดและปิดลิ้นชัก ให้ใช้ DrawerState คุณควรส่ง DrawerState ไปยัง ModalNavigationDrawer โดยใช้พารามิเตอร์ drawerState

DrawerState ให้สิทธิ์เข้าถึงฟังก์ชัน open และ close รวมถึงพร็อพเพอร์ตี้ที่เกี่ยวข้องกับสถานะลิ้นชักปัจจุบัน ฟังก์ชันการระงับเหล่านี้ต้องใช้ CoroutineScope ซึ่งคุณสร้างอินสแตนซ์ได้โดยใช้ rememberCoroutineScope นอกจากนี้ คุณยังเรียกใช้ฟังก์ชันการระงับเพื่อตอบสนองต่อเหตุการณ์ UI ได้ด้วย

val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()
ModalNavigationDrawer(
    drawerState = drawerState,
    drawerContent = {
        ModalDrawerSheet { /* Drawer content */ }
    },
) {
    Scaffold(
        floatingActionButton = {
            ExtendedFloatingActionButton(
                text = { Text("Show drawer") },
                icon = { Icon(Icons.Filled.Add, contentDescription = "") },
                onClick = {
                    scope.launch {
                        drawerState.apply {
                            if (isClosed) open() else close()
                        }
                    }
                }
            )
        }
    ) { contentPadding ->
        // Screen content
    }
}

สร้างกลุ่มภายในลิ้นชักการนำทาง

ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้างลิ้นชักการนำทางแบบละเอียดที่มีส่วนและตัวแบ่ง

@Composable
fun DetailedDrawerExample(
    content: @Composable (PaddingValues) -> Unit
) {
    val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
    val scope = rememberCoroutineScope()

    ModalNavigationDrawer(
        drawerContent = {
            ModalDrawerSheet {
                Column(
                    modifier = Modifier.padding(horizontal = 16.dp)
                        .verticalScroll(rememberScrollState())
                ) {
                    Spacer(Modifier.height(12.dp))
                    Text("Drawer Title", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleLarge)
                    HorizontalDivider()

                    Text("Section 1", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium)
                    NavigationDrawerItem(
                        label = { Text("Item 1") },
                        selected = false,
                        onClick = { /* Handle click */ }
                    )
                    NavigationDrawerItem(
                        label = { Text("Item 2") },
                        selected = false,
                        onClick = { /* Handle click */ }
                    )

                    HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp))

                    Text("Section 2", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium)
                    NavigationDrawerItem(
                        label = { Text("Settings") },
                        selected = false,
                        icon = { Icon(Icons.Outlined.Settings, contentDescription = null) },
                        badge = { Text("20") }, // Placeholder
                        onClick = { /* Handle click */ }
                    )
                    NavigationDrawerItem(
                        label = { Text("Help and feedback") },
                        selected = false,
                        icon = { Icon(Icons.AutoMirrored.Outlined.Help, contentDescription = null) },
                        onClick = { /* Handle click */ },
                    )
                    Spacer(Modifier.height(12.dp))
                }
            }
        },
        drawerState = drawerState
    ) {
        Scaffold(
            topBar = {
                TopAppBar(
                    title = { Text("Navigation Drawer Example") },
                    navigationIcon = {
                        IconButton(onClick = {
                            scope.launch {
                                if (drawerState.isClosed) {
                                    drawerState.open()
                                } else {
                                    drawerState.close()
                                }
                            }
                        }) {
                            Icon(Icons.Default.Menu, contentDescription = "Menu")
                        }
                    }
                )
            }
        ) { innerPadding ->
            content(innerPadding)
        }
    }
}

ประเด็นสำคัญเกี่ยวกับโค้ด

  • สร้าง drawerContent ด้วย Column ที่มีส่วน ตัวแบ่ง และรายการการนำทาง
  • ModalDrawerSheet มีการจัดรูปแบบ Material Design สำหรับลิ้นชัก
  • HorizontalDivider แยกส่วนต่างๆ ภายในลิ้นชัก
  • ModalNavigationDrawer จะสร้างลิ้นชัก
  • drawerContent กำหนดเนื้อหาของลิ้นชัก
  • ภายใน ModalDrawerSheet จะมี Column จัดเรียงองค์ประกอบลิ้นชักในแนวตั้ง
  • NavigationDrawerItem Composable แสดงถึงแต่ละรายการในลิ้นชัก
  • Scaffold มีโครงสร้างพื้นฐานของหน้าจอ รวมถึง TopAppBar
  • navigationIcon ใน TopAppBar จะควบคุมสถานะเปิดและปิดของลิ้นชัก

ผลลัพธ์

รูปภาพต่อไปนี้แสดงลักษณะของลิ้นชักเมื่อเปิด โดยมีส่วนและรายการต่างๆ แสดงอยู่

ลิ้นชักการนำทางแบบละเอียดที่มี 2 ส่วน โดยแต่ละส่วนมีรายการและไอคอนที่ติดป้ายกำกับหลายรายการ
รูปที่ 2 ลิ้นชักการนำทางเปิดขึ้นพร้อมกลุ่มที่ซ้อนกัน 2 กลุ่ม

แหล่งข้อมูลเพิ่มเติม