תפריטים

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

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

ממשק API

כדי להטמיע תפריט נפתח בהתאמה אישית, משתמשים ברכיבים DropdownMenu, DropdownMenuItem ו-IconButton. הרכיבים DropdownMenu ו-DropdownMenuItem משמשים להצגת הפריטים בתפריט, והרכיב IconButton הוא הטריגר להצגה או להסתרה של התפריט הנפתח.

הפרמטרים העיקריים של הרכיב DropdownMenu כוללים את הפרמטרים הבאים:

  • expanded: מציין אם התפריט גלוי.
  • onDismissRequest: משמש לטיפול בסגירת התפריט.
  • content: התוכן הקומפוזיציבי של התפריט, שבדרך כלל מכיל רכיבים קומפוזיציביים מסוג DropdownMenuItem.

הפרמטרים העיקריים של DropdownMenuItem כוללים את הפרמטרים הבאים:

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

יצירת תפריט נפתח בסיסי

קטע הקוד הבא מדגים הטמעה מינימלית של DropdownMenu:

@Composable
fun MinimalDropdownMenu() {
    var expanded by remember { mutableStateOf(false) }
    Box(
        modifier = Modifier
            .padding(16.dp)
    ) {
        IconButton(onClick = { expanded = !expanded }) {
            Icon(Icons.Default.MoreVert, contentDescription = "More options")
        }
        DropdownMenu(
            expanded = expanded,
            onDismissRequest = { expanded = false }
        ) {
            DropdownMenuItem(
                text = { Text("Option 1") },
                onClick = { /* Do something... */ }
            )
            DropdownMenuItem(
                text = { Text("Option 2") },
                onClick = { /* Do something... */ }
            )
        }
    }
}

נקודות עיקריות לגבי הקוד

  • הגדרה של DropdownMenu בסיסי שמכיל שני פריטי תפריט.
  • הפרמטר expanded קובע אם התפריט יוצג מורחב או מכווץ.
  • הפרמטר onDismissRequest מגדיר פונקציית קריאה חוזרת (callback) שתתבצע כשהמשתמש סוגר את התפריט.
  • הרכיב הקומפוזבילי DropdownMenuItem מייצג פריטים שניתן לבחור בתפריט הנפתח.
  • הלחצן IconButton מפעיל את ההרחבה והכיווץ של התפריט.

התוצאה

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

יצירת תפריט נפתח ארוך יותר

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

@Composable
fun LongBasicDropdownMenu() {
    var expanded by remember { mutableStateOf(false) }
    // Placeholder list of 100 strings for demonstration
    val menuItemData = List(100) { "Option ${it + 1}" }

    Box(
        modifier = Modifier
            .padding(16.dp)
    ) {
        IconButton(onClick = { expanded = !expanded }) {
            Icon(Icons.Default.MoreVert, contentDescription = "More options")
        }
        DropdownMenu(
            expanded = expanded,
            onDismissRequest = { expanded = false }
        ) {
            menuItemData.forEach { option ->
                DropdownMenuItem(
                    text = { Text(option) },
                    onClick = { /* Do something... */ }
                )
            }
        }
    }
}

נקודות עיקריות לגבי הקוד

  • אפשר לגלול ב-DropdownMenu כשהגובה הכולל של התוכן חורג מהמרחב הזמין. הקוד הזה יוצר DropdownMenu שניתן לגלילה שבו מוצגים 100 פריטים של placeholder.
  • הלולאה forEach יוצרת באופן דינמי רכיבים של DropdownMenuItem. הפריטים לא נוצרים באופן עצל, כלומר כל 100 הפריטים ברשימה הנפתחת נוצרים וקיימים ביצירה.
  • כשלוחצים על IconButton, הוא מפעיל את ההרחבה והכיווץ של DropdownMenu.
  • פונקציית הלמהדה onClick בתוך כל DropdownMenuItem מאפשרת לכם להגדיר את הפעולה שתתבצע כשהמשתמש יבחר פריט תפריט.

התוצאה

קטע הקוד שלמעלה יוצר את התפריט הניתן לגלילה הבא:

תפריט נפתח עם הרבה אפשרויות, שצריך לגלול כדי לראות את כל הפריטים.
איור 3. תפריט נפתח ארוך שניתן לגלילה.

יצירת תפריט נפתח ארוך יותר עם מפרידים

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

@Composable
fun DropdownMenuWithDetails() {
    var expanded by remember { mutableStateOf(false) }

    Box(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
    ) {
        IconButton(onClick = { expanded = !expanded }) {
            Icon(Icons.Default.MoreVert, contentDescription = "More options")
        }
        DropdownMenu(
            expanded = expanded,
            onDismissRequest = { expanded = false }
        ) {
            // First section
            DropdownMenuItem(
                text = { Text("Profile") },
                leadingIcon = { Icon(Icons.Outlined.Person, contentDescription = null) },
                onClick = { /* Do something... */ }
            )
            DropdownMenuItem(
                text = { Text("Settings") },
                leadingIcon = { Icon(Icons.Outlined.Settings, contentDescription = null) },
                onClick = { /* Do something... */ }
            )

            HorizontalDivider()

            // Second section
            DropdownMenuItem(
                text = { Text("Send Feedback") },
                leadingIcon = { Icon(Icons.Outlined.Feedback, contentDescription = null) },
                trailingIcon = { Icon(Icons.AutoMirrored.Outlined.Send, contentDescription = null) },
                onClick = { /* Do something... */ }
            )

            HorizontalDivider()

            // Third section
            DropdownMenuItem(
                text = { Text("About") },
                leadingIcon = { Icon(Icons.Outlined.Info, contentDescription = null) },
                onClick = { /* Do something... */ }
            )
            DropdownMenuItem(
                text = { Text("Help") },
                leadingIcon = { Icon(Icons.AutoMirrored.Outlined.Help, contentDescription = null) },
                trailingIcon = { Icon(Icons.AutoMirrored.Outlined.OpenInNew, contentDescription = null) },
                onClick = { /* Do something... */ }
            )
        }
    }
}

הקוד הזה מגדיר DropdownMenu בתוך Box.

נקודות עיקריות לגבי הקוד

  • הפרמטרים leadingIcon ו-trailingIcon מוסיפים סמלים לתחילת ולסוף של DropdownMenuItem.
  • הלחצן IconButton מפעיל את הרחבת התפריט.
  • ה-DropdownMenu מכיל כמה רכיבים של DropdownMenuItem, שכל אחד מהם מייצג פעולה שאפשר לבחור.
  • רכיבי HorizontalDivider מוסיפים קו אופקי כדי להפריד בין קבוצות של פריטים בתפריט.

התוצאה

קטע הקוד הקודם יוצר תפריט נפתח עם סמלים ומחיצות:

תפריט נפתח עם הקטעים 'פרופיל', 'הגדרות', 'שליחת משוב', 'מידע עלינו' ו-
איור 4. תפריט נפתח שמחולק לקטעים עם סמלים מובילים ומסיימים.

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