חלונית הזזה לניווט

הרכיב חלונית הזזה לניווט הוא תפריט נשלף שמאפשר למשתמשים לנווט לחלקים שונים באפליקציה. המשתמשים יכולים להפעיל אותו על ידי החלקה מהצד או לחיצה על סמל התפריט.

ריכזנו כאן שלושה תרחישים לדוגמה שכדאי להשתמש בהם בחלונית הזזה לניווט:

  • ארגון התוכן: מאפשר למשתמשים לעבור בין קטגוריות שונות, למשל באפליקציות של חדשות או בלוגים.
  • ניהול חשבון: קישורים מהירים להגדרות החשבון ולחלקים בפרופיל באפליקציות עם חשבונות משתמשים.
  • גילוי תכונות: ארגון של כמה תכונות והגדרות בתפריט אחד כדי לעזור למשתמשים לגלות אותן ולגשת אליהן באפליקציות מורכבות.

ב-Material Design יש שני סוגים של חלוניות הזזה לניווט:

  • רגיל: המודעה חולקת את שטח המסך עם תוכן אחר.
  • מודאלי: מופיע מעל תוכן אחר במסך.
דוגמה לחלונית הזזה לניווט ב-Material Design 3 במצב בהיר ובמצב כהה.
תרשים 1. דוגמה לחלונית הזזה לניווט.

דוגמה

אפשר להשתמש בפונקציה הקומפוזבילית 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. אפשר גם להפעיל את פונקציות ההשהיה בתגובה לאירועים בממשק המשתמש.

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 מסדר את הרכיבים של חלונית ההזזה בצורה אנכית.
  • רכיבי ה-Composable מסוג NavigationDrawerItem מייצגים פריטים ספציפיים בתפריט ההזזה.
  • ה-Scaffold מספק את המבנה הבסיסי של המסך, כולל ה-TopAppBar.
  • ה-navigationIcon ב-TopAppBar שולט במצב הפתיחה והסגירה של חלונית ההזזה.

תוצאה

בתמונה הבאה מוצג איך נראה חלונית ההזזה כשהיא פתוחה, עם החלקים והפריטים שמוצגים:

חלונית הזזה מפורטת לניווט עם שני חלקים, בכל אחד מהם יש כמה פריטים וסמלים עם תוויות.
איור 2. חלונית הזזה לניווט שנפתחה עם שתי קבוצות בת.

מקורות מידע נוספים