В этом руководстве рассказывается, как создать динамическую верхнюю панель приложения в Compose, которая меняет свои параметры при выборе элементов из списка. Вы можете изменить заголовок и действия на верхней панели приложения в зависимости от того, что выбрано.
Как реализовать динамическое поведение верхнего бара приложения
В этом коде определяется composable-функция для верхнего бара приложения, которая меняется в зависимости от выбранного элемента:
@Composable fun AppBarSelectionActions( selectedItems: Set<Int>, modifier: Modifier = Modifier, ) { val hasSelection = selectedItems.isNotEmpty() val topBarText = if (hasSelection) { "Selected ${selectedItems.size} items" } else { "List of items" } TopAppBar( title = { Text(topBarText) }, colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.primaryContainer, titleContentColor = MaterialTheme.colorScheme.primary, ), actions = { if (hasSelection) { IconButton(onClick = { /* click action */ }) { Icon( imageVector = Icons.Filled.Share, contentDescription = "Share items" ) } } }, modifier = modifier ) }
Ключевые моменты
AppBarSelectionActionsпринимаетSetиндексов выбранных элементов.- Значок
topBarTextменяется в зависимости от того, выбраны ли какие-либо объекты.- Когда вы выбираете объекты, в
TopAppBarпоявляется текст с описанием количества выбранных объектов. - Если вы не выберете ни одного объекта, в поле
topBarTextбудет указано "Список объектов".
- Когда вы выбираете объекты, в
- Блок
actionsопределяет действия, которые будут отображаться в верхней панели приложения. Если параметрhasSelectionимеет значение true, после текста появится значок совместного доступа. - Лямбда-функция
onClickизIconButtonобрабатывает действие "Поделиться", когда вы нажимаете на значок.
Результат
Как интегрировать список с возможностью выбора в динамическую верхнюю панель приложения
В этом примере показано, как добавить в динамическую верхнюю панель приложения список с возможностью выбора:
@Composable private fun AppBarMultiSelectionExample( modifier: Modifier = Modifier, ) { val listItems by remember { mutableStateOf(listOf(1, 2, 3, 4, 5, 6)) } var selectedItems by rememberSaveable { mutableStateOf(setOf<Int>()) } Scaffold( modifier = modifier, topBar = { AppBarSelectionActions(selectedItems) } ) { innerPadding -> LazyColumn(contentPadding = innerPadding) { itemsIndexed(listItems) { _, index -> val isItemSelected = selectedItems.contains(index) ListItemSelectable( selected = isItemSelected, Modifier .combinedClickable( interactionSource = remember { MutableInteractionSource() }, indication = null, onClick = { /* click action */ }, onLongClick = { if (isItemSelected) selectedItems -= index else selectedItems += index } ) ) } } } }
Ключевые моменты
- Верхняя панель обновляется в зависимости от того, сколько элементов списка вы выбрали.
selectedItemsсодержит набор индексов выбранных элементов.AppBarMultiSelectionExampleиспользуетScaffoldдля структурирования экрана.topBar = { AppBarSelectionActions(selectedItems) }задает компонентAppBarSelectionActionsв качестве верхнего бара приложения.AppBarSelectionActionsполучает статусselectedItems.
LazyColumnотображает элементы в вертикальном списке, показывая только те из них, которые видны на экране.ListItemSelectable– элемент списка, который можно выбрать.combinedClickableпозволяет обрабатывать как клики, так и нажатия с удержанием для выбора элемента. Нажатие выполняет действие, а долгое нажатие на элемент переключает его состояние выбора.
Результат