תפריטים נפתחים מאפשרים למשתמשים ללחוץ על סמל, שדה טקסט או רכיב אחר, ואז לבחור מתוך רשימת אפשרויות במשטח זמני. במדריך הזה נסביר איך ליצור תפריטים בסיסיים ותפריטים מורכבים יותר עם מחיצות וסמלים.
ממשק 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
מפעיל את ההרחבה והכיווץ של התפריט.
התוצאה
יצירת תפריט נפתח ארוך יותר
כברירת מחדל, אפשר לגלול ב-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
מאפשרת לכם להגדיר את הפעולה שתתבצע כשהמשתמש יבחר פריט תפריט.
התוצאה
קטע הקוד שלמעלה יוצר את התפריט הניתן לגלילה הבא:
יצירת תפריט נפתח ארוך יותר עם מפרידים
בקטע הקוד הבא מוצגת הטמעה מתקדמת יותר של תפריט נפתח. בקטע הקוד הזה, סמלים מובילים וסמליים נלווים מתווספים לפריטי התפריט, ומפרידים בין קבוצות של פריטי תפריט.
@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
מוסיפים קו אופקי כדי להפריד בין קבוצות של פריטים בתפריט.
התוצאה
קטע הקוד הקודם יוצר תפריט נפתח עם סמלים ומחיצות:
מקורות מידע נוספים
- Material Design: תפריטים