منوهای کشویی به کاربران این امکان را می دهند که روی نماد، فیلد متنی یا مؤلفه دیگر کلیک کنند و سپس از فهرستی از گزینه ها در یک سطح موقت انتخاب کنند. این راهنما نحوه ایجاد منوهای اصلی و منوهای پیچیده تر را با تقسیم کننده ها و نمادها شرح می دهد.
سطح 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
یک فراخوانی را تعریف می کند که زمانی که کاربر منو را می بندد اجرا می شود. - قابلیت ترکیب
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 مورد مکان نگهدار را نمایش می دهد. - حلقه
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
یک خط افقی را برای جدا کردن گروههای آیتمهای منو وارد میکنند.
نتیجه
قطعه قبلی یک منوی کشویی با نمادها و تقسیم کننده ها تولید می کند:
منابع اضافی
- طراحی متریال: منوها