کشوی پیمایش

عنصر کشوی پیمایش منو کشویی است که به کاربران امکان می‌دهد به بخش‌های مختلف برنامه شما پیمایش کنند. کاربران می‌توانند با کشیدن از کنار یا تک‌ضرب زدن روی نماد منو، آن را فعال کنند.

این سه مورد استفاده را برای پیاده‌سازی «کشوی پیمایش» درنظر بگیرید:

  • سازمان‌دهی محتوا: به کاربران امکان می‌دهد بین دسته‌های مختلف جابه‌جا شوند، مثلاً در برنامه‌های خبری یا وبلاگ‌نویسی.
  • مدیریت حساب: پیوندهای سریعی به تنظیمات حساب و بخش‌های نمایه در برنامه‌های دارای حساب کاربری ارائه می‌دهد.
  • کاوش ویژگی: چندین ویژگی و تنظیم را در یک منو سازمان‌دهی کنید تا کاوش و دسترسی کاربر در برنامه‌های پیچیده آسان‌تر شود.

در «طراحی مادی»، دو نوع کشوی پیمایش وجود دارد:

  • استاندارد: فضای صفحه را با محتوای دیگر هم‌رسانی کنید.
  • مشروط: در بالای محتوای دیگر در صفحه ظاهر می‌شود.
نمونه‌ای از کشو پیمایش Material Design 3 در حالت روشن و تاریک.
شکل ۱. نمونه‌ای از کشوی پیمایش.

مثال

می‌توانید از عنصر چیدمانی 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، DrawerState را به ModalNavigationDrawer ارسال کنید.

DrawerState دسترسی به عملکردهای open و close و همچنین ویژگی‌های مربوط به وضعیت فعلی کشو را فراهم می‌کند. این توابع تعلیق به 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(Icons.Outlined.Settings, contentDescription = null) },
                        badge = { Text("20") }, // Placeholder
                        onClick = { /* Handle click */ }
                    )
                    NavigationDrawerItem(
                        label = { Text("Help and feedback") },
                        selected = false,
                        icon = { Icon(Icons.AutoMirrored.Outlined.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(Icons.Default.Menu, contentDescription = "Menu")
                        }
                    }
                )
            }
        ) { innerPadding ->
            content(innerPadding)
        }
    }
}

نکات کلیدی درباره کد

  • drawerContent را با Column حاوی بخش‌ها، جداکننده‌ها، و عناصر پیمایش پر می‌کند.
  • ModalDrawerSheet سبک «طراحی مواد» را برای کشو ارائه می‌دهد.
  • HorizontalDivider بخش‌های داخل کشو را جدا می‌کند.
  • ModalNavigationDrawer کشو را ایجاد می‌کند.
  • ‫drawerContent محتوای کشو را تعریف می‌کند.
  • در ModalDrawerSheet، Column عناصر کشو را به‌صورت عمودی مرتب می‌کند.
  • عناصر ترکیبی NavigationDrawerItem نشان‌دهنده موارد تکی در کشویی هستند.
  • Scaffold ساختار اصلی صفحه را ارائه می‌دهد، ازجمله TopAppBar.
  • navigationIcon در TopAppBar وضعیت باز و بسته بودن کشو را کنترل می‌کند.

نتیجه

تصویر زیر نحوه نمایش کشو را هنگام باز شدن، با بخش‌ها و موارد نمایش‌داده‌شده نشان می‌دهد:

کشوی پیمایش دقیق با دو بخش که هرکدام دارای چندین مورد برچسب‌گذاری‌شده و نماد است.
شکل ۲. کشوی پیمایش با دو گروه تودرتو باز شد.

منابع بیشتر