Создайте динамическую верхнюю панель приложения.

В этом руководстве объясняется, как создать динамическую верхнюю панель приложений в Compose, которая меняет свои параметры при выборе элементов из списка. Вы можете изменить заголовок и действия верхней панели приложений в зависимости от состояния выбора.

Реализовать динамическое поведение верхней панели приложений

Этот код определяет компонуемую функцию для верхней панели приложения, которая изменяется в зависимости от выбора элемента:

@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"
                    )
                }
            }
        },
    )
}

Ключевые моменты кодекса

  • AppBarSelectionActions принимает Set индексов выбранных элементов.
  • topBarText изменяется в зависимости от того, выбраны ли какие-либо элементы.
    • При выборе элементов в TopAppBar появляется текст, описывающий количество выбранных элементов.
    • Если не выбрано ни одного элемента, topBarText будет содержать «Список элементов».
  • Блок actions определяет действия, отображаемые в верхней панели приложения. Если hasSelection имеет значение true, после текста появляется значок общего доступа.
  • Лямбда-функция onClick элемента IconButton обрабатывает действие «Поделиться» при нажатии на значок.

Результат

Динамическая верхняя панель приложения отображает текст Выбрано 3 элемента со значком общего доступа. Этот текст и значок появляются только при выборе элементов
Рисунок 1. Динамическая верхняя панель приложения с текстом и значком «Поделиться», которые появляются только при выборе элементов.

Интегрировать выбираемый список в динамическую верхнюю панель приложений

В этом примере показано, как добавить выбираемый список на динамическую верхнюю панель приложений:

@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(
        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 позволяет обрабатывать как щелчок, так и длинный щелчок для выбора элемента. Щелчок выполняет действие, а длинный щелчок по элементу переключает его состояние выбора.

Результат

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

Дополнительные ресурсы

,

В этом руководстве объясняется, как создать динамическую верхнюю панель приложений в Compose, которая меняет свои параметры при выборе элементов из списка. Вы можете изменить заголовок и действия верхней панели приложений в зависимости от состояния выбора.

Реализовать динамическое поведение верхней панели приложений

Этот код определяет компонуемую функцию для верхней панели приложения, которая изменяется в зависимости от выбора элемента:

@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"
                    )
                }
            }
        },
    )
}

Ключевые моменты кодекса

  • AppBarSelectionActions принимает Set индексов выбранных элементов.
  • topBarText изменяется в зависимости от того, выбраны ли какие-либо элементы.
    • При выборе элементов в TopAppBar появляется текст, описывающий количество выбранных элементов.
    • Если не выбрано ни одного элемента, topBarText будет содержать «Список элементов».
  • Блок actions определяет действия, отображаемые в верхней панели приложения. Если hasSelection имеет значение true, после текста появляется значок общего доступа.
  • Лямбда-функция onClick элемента IconButton обрабатывает действие «Поделиться» при нажатии на значок.

Результат

Динамическая верхняя панель приложения отображает текст Выбрано 3 элемента со значком общего доступа. Этот текст и значок появляются только при выборе элементов
Рисунок 1. Динамическая верхняя панель приложения с текстом и значком «Поделиться», которые появляются только при выборе элементов.

Интегрировать выбираемый список в динамическую верхнюю панель приложений

В этом примере показано, как добавить выбираемый список на динамическую верхнюю панель приложений:

@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(
        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 позволяет обрабатывать как щелчок, так и длинный щелчок для выбора элемента. Щелчок выполняет действие, а длинный щелчок по элементу переключает его состояние выбора.

Результат

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

Дополнительные ресурсы