choiminjun 블로그
Edge-to-edge 공부 본문
Android 15부터는 Edge-to-edge가 강제로 적용된다.
Edge-to-edge는 안드로이드 앱의 UI 콘텐츠를 화면 가장자리까지 확장하여, 시스템바 영역 뒤까지 앱의 배경이나 콘텐츠가 그려지도록 하는 기법으로 사용자에게 더 몰입감있는 경험을 주기 위해 만들어진 기법이다.

여기서 시스템 바란 상태 표시줄(Status bar)과 내비게이션 바(Navigation Bar) 영역을 말한다.



내부 구현
내부적으로 구현을 살펴보면 WindowCompat.setDecorFitsSystemWindows(window, false)를 통해서 화면을 확장한다는 것을 알 수 있다. 해당 코드의 의미는 메인 윈도우(Decor View)가 시스템 윈도우(시스템 바)까지 영역을 확장할지 말지를 결정하는 것이고 false일때 앱의 콘텐츠가 시스템 윈도우 영역 뒤까지 확장되어 그려진다.
시스템 아이콘(Status Bar에서 시간, 배터리, 와이파이 / Navigation Bar에서 탐색 버튼)은 다크 모드인지, 라이트 모드인지에 따라서 대비 색상으로(다크 모드일 때 White, 라이트 모드일 때 Black) 색상을 자동으로 조정한다.
다음과 같은 코드를 통해서는 Navigation Bar에 강제 색상 대비를 해제할 수 있다.
// Activity 내부
window.isNavigationBarContrastEnforced = true
// 또는
WindowCompat.setNavigationBarContrastEnforced(window, true)
다음과 같은 코드를 통해서는 Status Bar의 시스템 아이콘 색상을 밝은 색으로 표시할 지 어두운 색으로 표시할 지 선택할 수 있다.
// Activity 내부
val controller = WindowCompat.getInsetsController(window, window.decorView)
controller.isAppearanceLightStatusBars = true
controller.isAppearanceLightStatusBars = false
사용 방법
앱이 SDK 35 이상을 타겟팅하는 경우 Android 15 이상 기기에서 자동으로 설정된다.
이전 Android 버전에서 더 넓은 화면을 사용 설정하려면 Activity의 onCreate에서 enableEdgeToEdge를 수동으로 호출한다.

문제점
화면의 콘텐츠가 시스템 바 영역까지 확대되면서 앱 UI의 일부가 겹쳐져 가려질 수 있다. 이를 위해서는 Inset을 처리해야 한다.
Inset(인셋)이란 화면에서 시스템 UI 요소(예: 상태 표시줄, 내비게이션 바, 노치, 키보드 등)가 차지하는 공간이나 여백을 의미한다.
Inset의 종류는 다음과 같다.
System Bars Inset - 시스템 바(상태 바, 내비게이션 바)가 차지하는 영역
Display Cutout Inset - 디바이스에 물리적으로 존재하는 노치, 카메라 홀 등이 포함된 영역을 의미한다. 이 컷아웃에 의해서도 앱의 UI가 가려질 수 있으므로 신경써줘야 한다. 일반적으로 디바이스에 상단에 위치하고 디바이스가 가로 모드일 때는 왼쪽에 위치한다.
System Gestures Inset - 네비게이션 바가 스와이프 제스처 모드일 때 시스템 제스처(예: 홈 제스처, 뒤로 가기 제스처)가 우선적으로 사용되는 영역을 나타낸다


해결방안
해결방안은 Compose와 XML에서 각각 다를 수 있다.
Compose
Compose에서 Scaffold를 사용한다면 Scaffold가 제공하는 innerpadding을 적용하여 해결할 수 있다. Scaffold의 innerpadding에는 상태 바(Status Bar), 네비게이션 바(Navigation Bar), Scaffold Top Bar, Scaffold BottomBar의 크기가 모두 포함된다. 화면을 회전해서 가로 모드일 때는 display cutout 크기도 포함되는 것 같다.
Scaffold에 contentWindowInsets 속성에서도 safeDrawing, SafeContent, SafeGestures와 같은 속성을 목적에 맞게 사용할 수 있다.
- safeDrawing: displayCutout을 제외하고, 그림을 그리는 데 안전한 영역입니다. 배경처럼 시스템 바 뒤로 그려져도 괜찮지만 노치에는 가려지면 안 되는 경우 사용
- safeContent: systemBars, displayCutout, ime 등 모든 시스템 UI를 제외하고 상호작용 가능한 콘텐츠를 배치하기에 안전한 영역입니다.
- safeGestures: 뒤로 가기 같은 시스템 제스처 영역을 제외하고 앱의 제스처(스와이프 등)를 사용하기 안전한 영역입니다.
Scaffold를 사용하지 않는다면 다음과 같은 Modifier를 사용하여 padding을 줄 수 있다.
- Modifier.statusBarsPadding()
- Modifier.navigationBarsPadding()
- Modifier.safeDrawingPadding()
XML
많은 뷰 기반 Material 컴포넌트는 인셋을 자동으로 처리한다. 만약에 AppBarLayout 처럼 인셋을 자동처리하지 않는 뷰는 속성에android:fitsSystemWindows="true" 를 추가한다. 해당 속성은 시스템 바와 뷰가 겹치지 않도록 자신의 패딩(padding)을 자동으로 조정한다.
ViewCompat.setOnApplyWindowInsetsListener를 통해 여러 WindowInsets의 크기를 얻어 패딩으로 처리할 수 있다.
WindowInsets 종류
https://developer.android.com/develop/ui/compose/system/insets?hl=ko
창 인셋 정보 | Jetpack Compose | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 창 인셋 정보 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 플랫폼은 상태 표시줄, 탐색 메뉴
developer.android.com
adjustResize 미적용 문제
edge-to-edge에서는 시스템 바가 화면에서 제거된 것으로 처리되기 때문에 adjustResize를 적용하더라도 키보드에 의해 UI가 가려질 수 있다. 이때는 수동으로 padding을 조정해줘야 한다.
몰입 모드(Immerse mode)
일부 콘텐츠는 시스템 표시줄을 숨겨서 전체화면으로 표시하여 사용자에게 더 몰입감 있는 화면을 제공할 수 있다. 나 같은 경우 동영상 player에서 전체 화면 버튼을 클릭햇을 때 전체화면을 표시할 때 사용했다.
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
// Hide the system bars.
windowInsetsController.hide(Type.systemBars())
// Show the system bars.
windowInsetsController.show(Type.systemBars())
후기
화면 별로 디자이너와 조율하여 다양한 상태를 고려한 UI / UX 접근이 필요하다. 해당 글에서 작성한 이슈는 간단한 예시이며 실제 화면을 구현할 때 다양한 이슈가 발생할 수 있다.
Activity에서 WindowCompat을 통해 WindowInsetsController를 활용할 수 있으므로 더욱 유연한 UI를 구현할 수 있다.
출처
https://developer.android.com/develop/ui/views/layout/edge-to-edge?hl=ko#material-components
뷰에서 더 넓은 화면에 콘텐츠 표시 | Views | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 뷰에서 더 넓은 화면에 콘텐츠 표시 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Compose 방식으로 시
developer.android.com
https://haeti.palms.blog/edge-to-edge
[Android] Edge-to-Edge 이해하고 적용해보기
최신 안드로이드 기기에 대응하기 위하여 Edge-to-Edge를 대응하는 방법을 소개합니다.
haeti.palms.blog
https://techblog.gccompany.co.kr/%EB%8D%94-%EB%82%98%EC%9D%80-%EC%9C%A0%EC%A0%80-
더 나은 유저 몰입감을 위해서는 Edge-to-edge 적용은 필수
글. 김주엽(Groo) / Android Developer
techblog.gccompany.co.kr
https://www.youtube.com/watch?v=gIUe2OOzohw
https://www.youtube.com/watch?v=fdfhaEvxdy4
'Android' 카테고리의 다른 글
| PlayStore 앱 열기로 진입 시 Intent는 extras가 존재한다 (0) | 2025.12.22 |
|---|