تتيح القوائم المنسدلة للمستخدمين النقر على رمز أو حقل نصي أو مكوّن آخر، ثم الاختيار من قائمة الخيارات على سطح مؤقت. يوضّح هذا الدليل كيفية إنشاء قوائم أساسية وقوائم أكثر تعقيدًا تحتوي على فواصل ورموز.
مساحة عرض واجهة برمجة التطبيقات
استخدِم المكوّنات 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(painter = rememberVectorPainter(AppIcons.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(painter = rememberVectorPainter(AppIcons.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أو تصغيره. - تتيح لك دالة lambda
onClickضمن كلDropdownMenuItemتحديد الإجراء الذي يتم تنفيذه عندما يختار المستخدم عنصر قائمة.
النتيجة
ينتج عن مقتطف الرمز السابق القائمة التالية القابلة للتمرير:
إنشاء قائمة منسدلة أطول باستخدام الفواصل
يعرض المقتطف التالي تنفيذًا أكثر تقدّمًا لقائمة منسدلة. في هذا المقتطف، تتم إضافة رموز بادئة ولاحقة إلى عناصر القائمة، وتفصل الفواصل بين مجموعات عناصر القائمة.
@Composable fun DropdownMenuWithDetails() { var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(painter = rememberVectorPainter(AppIcons.MoreVert), contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { // First section DropdownMenuItem( text = { Text("Profile") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Person), contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Settings") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Settings), contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Second section DropdownMenuItem( text = { Text("Send Feedback") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Feedback), contentDescription = null) }, trailingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Send), contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Third section DropdownMenuItem( text = { Text("About") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Info), contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Help") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Help), contentDescription = null) }, trailingIcon = { Icon(painter = rememberVectorPainter(AppIcons.OpenInNew), contentDescription = null) }, onClick = { /* Do something... */ } ) } } }
يحدّد هذا الرمز DropdownMenu ضمن Box.
نقاط رئيسية حول الرمز
- تضيف المَعلمتان
leadingIconوtrailingIconرموزًا إلى بدايةDropdownMenuItemونهايته. - يؤدي النقر على
IconButtonإلى توسيع القائمة. - يحتوي
DropdownMenuعلى عدة دوال مركّبة من النوعDropdownMenuItem، يمثّل كل منها إجراءً يمكن اختياره. - تُدرج الدوال المركّبة
HorizontalDividerخطًا أفقيًا لفصل مجموعات عناصر القائمة.
النتيجة
ينتج عن المقتطف السابق قائمة منسدلة تحتوي على رموز وفواصل:
مراجع إضافية
- التصميم المتعدد الأبعاد: القوائم