Компонент панели навигации представляет собой выдвижное меню, с помощью которого пользователи могут переходить в разные разделы приложения. Чтобы открыть его, нужно провести пальцем от края экрана или нажать на значок меню.
Ниже приведены три примера использования панели навигации.
- Организация контента. Предоставьте пользователям возможность переключаться между разными категориями, например в новостных приложениях или блогах.
- Управление аккаунтом. Быстрые ссылки на настройки аккаунта и разделы профиля в приложениях с аккаунтами пользователей.
- Поиск функций. В сложных приложениях можно упорядочить функции и настройки в одном меню, чтобы пользователям было проще их находить и использовать.
В Material Design есть два типа выдвижных панелей навигации:
- Стандартный. Позволяет делить экран с другим контентом.
- Модальное окно. Появляется поверх другого контента на экране.
Пример
Для реализации выдвижной панели навигации можно использовать composable-функцию 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располагает элементы выдвигающейся панели вертикально. - Composable-функции
NavigationDrawerItemпредставляют отдельные элементы на выдвигающейся панели. - Объект
Scaffoldзадает базовую структуру экрана, в том числеTopAppBar. navigationIconвTopAppBarуправляет состоянием выдвижной панели (открыта или закрыта).
Результат
На изображении ниже показано, как выглядит выдвигающаяся панель в открытом виде с разделами и элементами.
Дополнительные ресурсы
- Material Design: панель навигации