لائحة التنقل

لائحة التنقل هي قائمة منزلقة تتيح للمستخدمين التنقّل بين أقسام مختلفة من تطبيقك، ويمكن تفعيلها من خلال التمرير سريعًا من جانب الشاشة أو النقر على رمز القائمة.

في ما يلي ثلاث حالات استخدام لتنفيذ لائحة التنقل:

  • تنظيم المحتوى: يمكنك السماح للمستخدمين بالتبديل بين الفئات المختلفة، مثل تطبيقات الأخبار أو التدوين.
  • إدارة الحساب: توفير روابط سريعة تؤدي إلى إعدادات الحساب وأقسام الملف الشخصي في التطبيقات التي تتضمّن حسابات مستخدمين
  • استكشاف الميزات: يمكنك تنظيم ميزات وإعدادات متعددة في قائمة واحدة لتسهيل استكشافها والوصول إليها في التطبيقات المعقّدة.

في التصميم المتعدد الأبعاد، هناك نوعان من لوائح التنقل:

  • عادي: يمكنك مشاركة مساحة ضمن شاشة مع محتوى آخر.
  • النافذة المشروطة: تظهر فوق المحتوى الآخر على الشاشة.
مثال على لائحة التنقّل في التصميم المتعدد الأبعاد 3 في الوضعَين الفاتح والداكن
الشكل 1. مثال على لائحة التنقّل

مثال

يمكنك استخدام الدالة المركّبة 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 في حالة فتح الدرج وإغلاقه.

النتيجة

توضّح الصورة التالية كيفية ظهور الدرج عند فتحه، مع عرض الأقسام والعناصر:

لائحة تنقّل مفصّلة تتضمّن قسمَين، يحتوي كلّ منهما على عناصر ورموز متعددة مصنّفة
الشكل 2. لائحة تنقّل مفتوحة مع مجموعتَين مدمجتَين

مراجع إضافية