탐색 레일

레일을 통해 대형 화면 기기에서 실행되는 앱의 대상에 액세스할 수 있습니다. 다음과 같은 경우 탐색 레일을 사용해야 합니다.

  • 앱의 어디에서나 액세스할 수 있어야 하는 최상위 대상
  • 3~7개의 주요 대상
  • 태블릿 또는 데스크톱 레이아웃
화면 왼쪽에 있는 세로 탐색 레일에는 대상 4개(모든 파일, 최근, 사진, 라이브러리)와 플로팅 작업 버튼 1개가 있으며, 각 대상에는 관련 아이콘이 표시되어 있습니다.
그림 1. 대상 4개와 플로팅 작업 버튼 1개가 있는 탐색 레일

이 페이지에서는 관련 화면과 기본 탐색을 사용하여 앱에 레일을 표시하는 방법을 보여줍니다.

API 노출 영역

NavigationRailItem과 함께 NavigationRail 컴포저블을 사용하여 애플리케이션에 레일을 구현합니다. NavigationRailItem은 레일 열의 단일 레일 항목을 나타냅니다.

NavigationRailItem에는 다음 주요 매개변수가 포함됩니다.

  • selected: 현재 레일 항목이 시각적으로 강조 표시되었는지 여부를 확인합니다.
  • onClick(): 사용자가 레일 항목을 클릭할 때 실행할 작업을 정의하는 필수 람다 함수입니다. 여기에서 일반적으로 탐색 이벤트를 처리하거나, 선택된 레일 항목 상태를 업데이트하거나, 해당 콘텐츠를 로드합니다.
  • label: 레일 항목 내에 텍스트를 표시합니다. 선택사항입니다.
  • icon: 레일 항목 내에 아이콘을 표시합니다. 선택사항입니다.

예: 레일 기반 탐색

다음 스니펫은 사용자가 앱의 여러 화면 간에 이동할 수 있도록 탐색 레일을 구현합니다.

@Composable
fun NavigationRailExample(modifier: Modifier = Modifier) {
    val navController = rememberNavController()
    val startDestination = Destination.SONGS
    var selectedDestination by rememberSaveable { mutableIntStateOf(startDestination.ordinal) }

    Scaffold(modifier = modifier) { contentPadding ->
        NavigationRail(modifier = Modifier.padding(contentPadding)) {
            Destination.entries.forEachIndexed { index, destination ->
                NavigationRailItem(
                    selected = selectedDestination == index,
                    onClick = {
                        navController.navigate(route = destination.route)
                        selectedDestination = index
                    },
                    icon = {
                        Icon(
                            destination.icon,
                            contentDescription = destination.contentDescription
                        )
                    },
                    label = { Text(destination.label) }
                )
            }
        }
        AppNavHost(navController, startDestination)
    }
}

핵심 사항

  • NavigationRail은 세로 열로 구성된 레일 항목을 표시하며 각 항목은 Destination에 해당합니다.
  • val navController = rememberNavController()NavHost 내에서 탐색을 관리하는 NavHostController의 인스턴스를 만들고 저장합니다.
  • var selectedDestination by rememberSaveable { mutableIntStateOf(startDestination.ordinal) }은 현재 선택된 레일 항목의 상태를 관리합니다.
    • startDestination.ordinalDestination.SONGS enum 항목의 숫자 색인(위치)을 가져옵니다.
  • 레일 항목을 클릭하면 navController.navigate(route = destination.route)가 호출되어 해당 화면으로 이동합니다.
  • NavigationRailItemonClick 람다는 클릭된 레일 항목을 시각적으로 강조 표시하도록 selectedDestination 상태를 업데이트합니다.
  • AppNavHost 컴포저블을 호출하여 navControllerstartDestination을 전달함으로써 선택한 화면의 실제 콘텐츠를 표시합니다.

결과

다음 이미지는 이전 스니펫의 결과를 보여줍니다.

관련 아이콘이 표시된 대상 3개(노래, 앨범, 재생목록)가 있는 세로 탐색 레일입니다. 아이콘은 레일에 있는 각 탐색 버튼의 용도를 시각적으로 나타냅니다. 각 대상은 관련 아이콘과 짝을 이루고 있습니다(예: 노래의 경우 음표).
그림 2. 관련 아이콘이 표시된 대상 3개(노래, 앨범, 재생목록)가 있는 탐색 레일

추가 리소스