Компонент панели навигации — это выдвижное меню, которое позволяет пользователям переходить к различным разделам вашего приложения. Пользователи могут активировать его, проведя пальцем сбоку или коснувшись значка меню.
Рассмотрим эти три варианта использования для реализации навигационного ящика:
- Организация контента: дайте пользователям возможность переключаться между различными категориями, например, в новостях или приложениях для ведения блогов.
- Управление учетной записью: предоставление быстрых ссылок на настройки учетной записи и разделы профиля в приложениях с учетными записями пользователей.
- Обнаружение функций. Организуйте несколько функций и настроек в одном меню, чтобы облегчить пользователям обнаружение и доступ к сложным приложениям.
В Material Design существует два типа навигационных ящиков:
- Стандартный: разделяет пространство на экране с другим содержимым.
- Модальное: появляется поверх другого контента на экране.
![](https://developer.android.google.cn/static/develop/ui/compose/images/layouts/material/m3-navigation-drawer.png?authuser=2&hl=ru)
Пример
Вы можете использовать составной элемент 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
предоставляет доступ к функциям 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
обеспечивает стиль Material Design для ящика. -
HorizontalDivider
разделяет секции внутри ящика. -
ModalNavigationDrawer
создает ящик. -
drawerContent
определяет содержимое ящика. - Внутри
ModalDrawerSheet
Column
размещает элементы ящика вертикально. - Составные элементы
NavigationDrawerItem
представляют отдельные элементы в ящике. -
Scaffold
обеспечивает базовую структуру экрана, включаяTopAppBar
. -
navigationIcon
вTopAppBar
управляет состоянием открытия и закрытия ящика.
Результат
На следующем изображении показано, как выглядит ящик при открытии, с отображаемыми разделами и элементами:
![Подробный навигационный ящик с двумя разделами, каждый из которых содержит несколько помеченных элементов и значков.](https://developer.android.google.cn/static/develop/ui/compose/images/components/drawer-detailed.png?authuser=2&hl=ru)
Дополнительные ресурсы
- Материальный дизайн: навигационный ящик.