لائحة التنقل هي قائمة منزلقة تتيح للمستخدمين التنقّل بين أقسام مختلفة من تطبيقك، ويمكن تفعيلها من خلال التمرير سريعًا من جانب الشاشة أو النقر على رمز القائمة.
في ما يلي ثلاث حالات استخدام لتنفيذ لائحة التنقل:
- تنظيم المحتوى: يمكنك السماح للمستخدمين بالتبديل بين الفئات المختلفة، مثل تطبيقات الأخبار أو التدوين.
- إدارة الحساب: توفير روابط سريعة تؤدي إلى إعدادات الحساب وأقسام الملف الشخصي في التطبيقات التي تتضمّن حسابات مستخدمين
- استكشاف الميزات: يمكنك تنظيم ميزات وإعدادات متعددة في قائمة واحدة لتسهيل استكشافها والوصول إليها في التطبيقات المعقّدة.
في التصميم المتعدد الأبعاد، هناك نوعان من لوائح التنقل:
- عادي: يمكنك مشاركة مساحة ضمن شاشة مع محتوى آخر.
- النافذة المشروطة: تظهر فوق المحتوى الآخر على الشاشة.
مثال
يمكنك استخدام الدالة المركّبة 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 provides access to the open and close functions, as
well as properties related to the current drawer state. تتطلّب دوال التعليق هذه استخدام 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(painter = rememberVectorPainter(AppIcons.Settings), contentDescription = null) }, badge = { Text("20") }, // Placeholder onClick = { /* Handle click */ } ) NavigationDrawerItem( label = { Text("Help and feedback") }, selected = false, icon = { Icon(painter = rememberVectorPainter(AppIcons.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(painter = rememberVectorPainter(AppIcons.Menu), contentDescription = "Menu") } } ) } ) { innerPadding -> content(innerPadding) } } }
نقاط رئيسية حول الرمز
- يملأ
drawerContentبـColumnيحتوي على أقسام وفواصل وعناصر تنقّل. - يوفّر
ModalDrawerSheetنمط التصميم المتعدد الأبعاد للدرج. - يفصل
HorizontalDividerبين الأقسام داخل الدرج. - ينشئ
ModalNavigationDrawerالدرج. - يحدّد
drawerContentمحتوى الدرج. - داخل
ModalDrawerSheet، يرتّبColumnعناصر الدرج عموديًا. - تمثّل الدوال المركّبة
NavigationDrawerItemالعناصر الفردية في الدرج. - يوفّر
Scaffoldالبنية الأساسية للشاشة، بما في ذلكTopAppBar. - يتحكّم
navigationIconفيTopAppBarفي حالة فتح الدرج وإغلاقه.
النتيجة
توضّح الصورة التالية كيفية ظهور الدرج عند فتحه، مع عرض الأقسام والعناصر:
مراجع إضافية
- التصميم المتعدد الأبعاد: لائحة التنقّل