建立動態頂端應用程式列

本指南說明如何在 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,文字後方會顯示分享圖示。
  • IconButtononClick lambda 會在點選圖示時處理分享動作。

結果

動態頂端應用程式列會顯示「Selected 3 items」文字和分享圖示。這段文字和圖示只會在選取項目時顯示
圖 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 可同時處理點選和長按項目選取項目。點選會執行動作,而長按項目則會切換選取狀態。

結果

動態頂端應用程式列會顯示「Selected 3 items」文字,後面接著是分享圖示。下方清單顯示多個項目,選取的三個項目旁邊有勾號
圖 2. 已整合至動態頂端應用程式列的清單,並選取特定項目。

其他資源