CoordinatorLayout
는 복잡하고 겹쳐지고 중첩된 레이아웃을 사용 설정하는 ViewGroup
입니다. 내부에 포함된 뷰의 특정 Material Design 상호작용(예: 툴바 및 하단 시트 펼치기/접기)을 사용 설정하기 위한 컨테이너로 사용됩니다.
Compose에서 CoordinatorLayout
와 가장 유사한 것은 Scaffold
입니다. Scaffold
는 Material Components를 일반적인 화면 패턴 및 상호작용으로 결합하기 위한 콘텐츠 슬롯을 제공합니다. 이 페이지에서는 Compose에서 Scaffold
를 사용하도록 CoordinatorLayout
구현을 이전하는 방법을 설명합니다.
이전 단계
CoordinatorLayout
를 Scaffold
로 이전하려면 다음 단계를 따르세요.
아래 스니펫에서
CoordinatorLayout
는ToolBar
,ViewPager
,FloatingActionButton
를 포함하기 위한AppBarLayout
를 포함합니다. UI 계층 구조에서CoordinatorLayout
및 그 하위 요소를 주석 처리하고 이를 대체할ComposeView
를 추가합니다.<!-- <androidx.coordinatorlayout.widget.CoordinatorLayout--> <!-- android:id="@+id/coordinator_layout"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- android:fitsSystemWindows="true">--> <!-- <androidx.compose.ui.platform.ComposeView--> <!-- android:id="@+id/compose_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent"--> <!-- app:layout_behavior="@string/appbar_scrolling_view_behavior" />--> <!-- <com.google.android.material.appbar.AppBarLayout--> <!-- android:id="@+id/app_bar_layout"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="wrap_content"--> <!-- android:fitsSystemWindows="true"--> <!-- android:theme="@style/Theme.Sunflower.AppBarOverlay">--> <!-- AppBarLayout contents here --> <!-- </com.google.android.material.appbar.AppBarLayout>--> <!-- </androidx.coordinatorlayout.widget.CoordinatorLayout>--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" />
Fragment 또는 Activity에서 방금 추가한
ComposeView
에 대한 참조를 가져와서setContent
메서드를 호출합니다. 메서드의 본문에서Scaffold
를 콘텐츠로 설정합니다.composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold contents // ... } }
Scaffold
의 콘텐츠에 화면의 기본 콘텐츠를 추가합니다. 위 XML의 기본 콘텐츠는ViewPager2
이므로 Compose에 상응하는HorizontalPager
를 사용합니다.Scaffold
의content
람다도 콘텐츠 루트에 적용해야 하는PaddingValues
인스턴스를 수신합니다.Modifier.padding
를 사용하여 동일한PaddingValues
를HorizontalPager
에 적용할 수 있습니다.composeView.setContent { Scaffold(Modifier.fillMaxSize()) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
Scaffold
에서 제공하는 다른 콘텐츠 슬롯을 사용하여 화면 요소를 더 추가하고 나머지 하위 뷰를 이전합니다.topBar
슬롯을 사용하여TopAppBar
를 추가하고floatingActionButton
슬롯을 사용하여FloatingActionButton
를 제공할 수 있습니다.composeView.setContent { Scaffold( Modifier.fillMaxSize(), topBar = { TopAppBar( title = { Text("My App") } ) }, floatingActionButton = { FloatingActionButton( onClick = { /* Handle click */ } ) { Icon( Icons.Filled.Add, contentDescription = "Add Button" ) } } ) { contentPadding -> val pagerState = rememberPagerState { 10 } HorizontalPager( state = pagerState, modifier = Modifier.padding(contentPadding) ) { /* Page contents */ } } }
일반적인 사용 사례
툴바 접기 및 펼치기
뷰 시스템에서 CoordinatorLayout
를 사용하여 툴바를 접고 펼치려면 AppBarLayout
를 툴바의 컨테이너로 사용합니다. 그런 다음 연결된 스크롤 가능한 뷰(예: RecyclerView
또는 NestedScrollView
)의 XML에서 layout_behavior
를 통해 Behavior
를 지정하여 스크롤할 때 툴바가 접히거나 펼쳐지는 방식을 선언할 수 있습니다.
Compose에서는 TopAppBarScrollBehavior
를 통해 유사한 효과를 달성할 수 있습니다. 예를 들어 위로 스크롤할 때 툴바가 표시되도록 접기/펼치기 툴바를 구현하려면 다음 단계를 따르세요.
TopAppBarDefaults.enterAlwaysScrollBehavior()
를 호출하여TopAppBarScrollBehavior
를 만듭니다.- 만든
TopAppBarScrollBehavior
를TopAppBar
에 제공합니다. 스크롤 가능한 콘텐츠가 위아래로 스크롤될 때 Scaffold가 중첩 스크롤 이벤트를 수신할 수 있도록
Scaffold
의Modifier.nestedScroll
를 통해NestedScrollConnection
를 연결합니다. 이렇게 하면 콘텐츠가 스크롤될 때 포함된 앱 바가 적절하게 접히거나 펼칠 수 있습니다.// 1. Create the TopAppBarScrollBehavior val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() Scaffold( topBar = { TopAppBar( title = { Text("My App") }, // 2. Provide scrollBehavior to TopAppBar scrollBehavior = scrollBehavior ) }, // 3. Connect the scrollBehavior.nestedScrollConnection to the Scaffold modifier = Modifier .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection) ) { contentPadding -> /* Contents */ // ... }
접기/펼치기 스크롤 효과 맞춤설정
enterAlwaysScrollBehavior
에 여러 매개변수를 제공하여 접기/펼치기 애니메이션 효과를 맞춤설정할 수 있습니다. TopAppBarDefaults
는 콘텐츠가 맨 아래로 스크롤될 때만 앱 바를 확장하는 exitUntilCollapsedScrollBehavior
와 같은 다른 TopAppBarScrollBehavior
도 제공합니다.
완전한 맞춤 효과 (예: 시차 효과)를 만들려면 자체 NestedScrollConnection
를 만들고 콘텐츠가 스크롤될 때 수동으로 툴바를 오프셋하면 됩니다. 코드 예는 AOSP의 중첩 스크롤 샘플을 참고하세요.
창
뷰를 사용하면 DrawerLayout
를 루트 뷰로 사용하여 탐색 창을 구현합니다. 그러면 CoordinatorLayout
는 DrawerLayout
의 하위 뷰입니다. DrawerLayout
에는 창에 탐색 옵션을 표시하는 다른 하위 뷰(예: NavigationView
)도 포함되어 있습니다.
Compose에서는 ModalNavigationDrawer
컴포저블을 사용하여 탐색 창을 구현할 수 있습니다. ModalNavigationDrawer
는 창을 위한 drawerContent
슬롯과 화면 콘텐츠를 위한 content
슬롯을 제공합니다.
ModalNavigationDrawer( drawerContent = { ModalDrawerSheet { Text("Drawer title", modifier = Modifier.padding(16.dp)) HorizontalDivider() NavigationDrawerItem( label = { Text(text = "Drawer Item") }, selected = false, onClick = { /*TODO*/ } ) // ...other drawer items } } ) { Scaffold(Modifier.fillMaxSize()) { contentPadding -> // Scaffold content // ... } }
자세한 내용은 창을 참고하세요.
스낵바
Scaffold
는 SnackbarHost
컴포저블을 허용하여 Snackbar
를 표시할 수 있는 snackbarHost
슬롯을 제공합니다.
val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } Scaffold( snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, floatingActionButton = { ExtendedFloatingActionButton( text = { Text("Show snackbar") }, icon = { Icon(Icons.Filled.Image, contentDescription = "") }, onClick = { scope.launch { snackbarHostState.showSnackbar("Snackbar") } } ) } ) { contentPadding -> // Screen content // ... }
자세한 내용은 스낵바를 참고하세요.
자세히 알아보기
CoordinatorLayout
를 Compose로 이전하는 방법에 관한 자세한 내용은 다음 리소스를 참고하세요.
- Material 구성요소 및 레이아웃:
Scaffold
와 같이 Compose에서 지원되는 Material Design 구성요소에 관한 문서입니다. - Sunflower를 Jetpack Compose로 이전:
CoordinatorLayout
가 포함된 Sunflower 샘플 앱의 뷰에서 Compose로의 이전 여정을 문서화한 블로그 게시물입니다.
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- Material 구성요소 및 레이아웃
- Compose의 창 인셋
- 스크롤