동적 상단 앱 바 만들기

이 가이드에서는 목록에서 항목이 선택될 때 옵션을 변경하는 동적 상단 앱 바를 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 람다는 아이콘을 클릭할 때 공유 작업을 처리합니다.

결과

동적 상단 앱 바에 공유 아이콘과 함께 &#39;선택한 항목 3개&#39;라는 텍스트가 표시됩니다. 이 텍스트와 아이콘은 항목이 선택된 경우에만 표시됩니다.
그림 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는 선택된 항목 색인 집합을 보유합니다.
  • AppBarMultiSelectionExampleScaffold를 사용하여 화면을 구성합니다.
    • topBar = { AppBarSelectionActions(selectedItems) }는 AppBarSelectionActions 컴포저블을 상단 앱 바로 설정합니다. AppBarSelectionActionsselectedItems 상태를 수신합니다.
  • LazyColumn는 항목을 세로 목록으로 표시하여 화면에 표시되는 항목만 렌더링합니다.
  • ListItemSelectable는 선택 가능한 목록 항목을 나타냅니다.
    • combinedClickable는 항목 선택을 위한 클릭 및 길게 클릭 처리를 모두 허용합니다. 클릭하면 작업이 실행되고 항목을 길게 클릭하면 선택 상태가 전환됩니다.

결과

동적 상단 앱 바에 &#39;선택한 항목 3개&#39;라는 텍스트와 공유 아이콘이 표시됩니다. 아래 목록에는 여러 항목이 표시되어 있으며 선택된 세 개의 항목 옆에 체크표시가 있습니다.
그림 2. 특정 항목이 선택된 동적 상단 앱 바에 통합된 목록

추가 리소스