Вкладки позволяют упорядочивать группы связанного контента. Существует два типа вкладок:
- Основные вкладки : расположены в верхней части панели контента под верхней панелью приложения. На них отображаются основные разделы контента, и их следует использовать, когда необходим только один набор вкладок.
- Дополнительные вкладки : используются в области контента для дальнейшего разделения связанного контента и установления иерархии. Они необходимы, когда экран требует более одного уровня вкладок.

На этой странице показано, как отображать основные вкладки в вашем приложении вместе со связанными экранами и базовой навигацией.
Поверхность API
Для реализации вкладок используйте составные объекты Tab , PrimaryTabRow и SecondaryTabRow . Составной объект Tab представляет собой отдельную вкладку в строке и обычно используется внутри PrimaryTabRow (для основных вкладок-индикаторов) или SecondaryTabRow (для второстепенных вкладок-индикаторов).
Tab содержит следующие ключевые параметры:
-
selected: Определяет, будет ли текущая вкладка визуально выделена. -
onClick(): Обязательная лямбда-функция, определяющая действие, которое должно быть выполнено при щелчке пользователя по вкладке. Здесь обычно обрабатываются события навигации, обновляется состояние выбранной вкладки или загружается соответствующий контент. -
text: Отображает текст на вкладке. Необязательно. -
icon: Отображает значок на вкладке. Необязательно. -
enabled: Определяет, включена ли вкладка и можно ли с ней взаимодействовать. Если установлено значение false, вкладка отображается в неактивном состоянии и не реагирует на щелчки.
Пример: навигация по вкладкам
Следующий фрагмент кода реализует верхнюю панель навигации с вкладками для переключения между различными экранами приложения:
@Composable fun NavigationTabExample(modifier: Modifier = Modifier) { val navController = rememberNavController() val startDestination = Destination.SONGS var selectedDestination by rememberSaveable { mutableIntStateOf(startDestination.ordinal) } Scaffold(modifier = modifier) { contentPadding -> PrimaryTabRow(selectedTabIndex = selectedDestination, modifier = Modifier.padding(contentPadding)) { Destination.entries.forEachIndexed { index, destination -> Tab( selected = selectedDestination == index, onClick = { navController.navigate(route = destination.route) selectedDestination = index }, text = { Text( text = destination.label, maxLines = 2, overflow = TextOverflow.Ellipsis ) } ) } } AppNavHost(navController, startDestination) } }
Ключевые моменты
-
PrimaryTabRowотображает горизонтальный ряд вкладок, каждая из которых соответствует определенному пунктуDestination. -
val navController = rememberNavController()создает и запоминает экземплярNavHostController, который управляет навигацией внутриNavHost. -
var selectedDestination by rememberSaveable { mutableIntStateOf(startDestination.ordinal) }управляет состоянием выбранной вкладки.-
startDestination.ordinalполучает числовой индекс (позицию) записи в перечисленииDestination.SONGS.
-
- При нажатии на вкладку лямбда-функция
onClickвызываетnavController.navigate(route = destination.route)для перехода к соответствующему экрану. - Лямбда-функция
onClickэлементаTabобновляет состояниеselectedDestination, чтобы визуально выделить нажатую вкладку. - Он вызывает составной объект
AppNavHost, передавая емуnavControllerиstartDestination, для отображения фактического содержимого выбранного экрана.
Результат
На следующем изображении показан результат предыдущего фрагмента кода:
.png?authuser=00&hl=ru)