이전 글인 Android 15 SystemBar 관련 변경사항 에 대한 내용을 정리하며 공부했던 enableEdgeToEdge 에 대해 공유하고자 합니다.

enableEdgeToEdge 는 SystemBar(StatusBar, NavigationBar) 영역까지 화면을 확장시키는 함수입니다.
fun ComponentActivity.enableEdgeToEdge(
statusBarStyle: SystemBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
navigationBarStyle: SystemBarStyle = SystemBarStyle.auto(DefaultLightScrim, DefaultDarkScrim)
) {
val view = window.decorView
val statusBarIsDark = statusBarStyle.detectDarkMode(view.resources)
val navigationBarIsDark = navigationBarStyle.detectDarkMode(view.resources)
val impl =
Impl
?: if (Build.VERSION.SDK_INT >= 30) {
EdgeToEdgeApi30()
} else if (Build.VERSION.SDK_INT >= 29) {
EdgeToEdgeApi29()
} else if (Build.VERSION.SDK_INT >= 28) {
EdgeToEdgeApi28()
} else if (Build.VERSION.SDK_INT >= 26) {
EdgeToEdgeApi26()
} else if (Build.VERSION.SDK_INT >= 23) {
EdgeToEdgeApi23()
} else
if (Build.VERSION.SDK_INT >= 21) {
EdgeToEdgeApi21()
} else {
EdgeToEdgeBase()
}
.also { Impl = it }
impl.setUp(
statusBarStyle,
navigationBarStyle,
window,
view,
statusBarIsDark,
navigationBarIsDark
)
impl.adjustLayoutInDisplayCutoutMode(window)
}
enableEdgeToEdge 는 statusBarStyle 과 navigationBarStyle 이라는 SystemBarStyle 클래스를 파라미터로 갖습니다.
enableEdgeToEdge 의 역할은 크게 총 세 가지로 나눌 수 있습니다.
impl정의impl.setUP()impl.adjustLayoutInDisplayCutoutMode()
enableEdgeToEdge 에서 impl 변수의 역할을 굉장히 중요해 보입니다.
impl은 SDK 버전에 따라 EdgeToEdgeImpl 인터페이스를 구현한 EdgeToEdgeApi00 인스턴스입니다.
private interface EdgeToEdgeImpl {
fun setUp(
statusBarStyle: SystemBarStyle,
navigationBarStyle: SystemBarStyle,
window: Window,
view: View,
statusBarIsDark: Boolean,
navigationBarIsDark: Boolean
)
fun adjustLayoutInDisplayCutoutMode(window: Window)
}
EdgeToEdgeImpl 인터페이스는 setUp 과 adjustLayoutInDisplayCutoutMode 라는 메서드를 가지고 있습니다.
setUp: 상태바와 네비게이션바의 스타일 설정
adjustLayoutInDisplayCutoutMode: 컷아웃모드 설정
사실 EdgeToEdgeApi00 클래스는 EdgeToEdgeImpl 인터페이스를 구현한 클래스라고 할 수 없습니다.
@RequiresApi(30)
private class EdgeToEdgeApi30 : EdgeToEdgeApi29() { /** **/ }
@RequiresApi(29)
private open class EdgeToEdgeApi29 : EdgeToEdgeApi28() { /** **/ }
@RequiresApi(28)
private open class EdgeToEdgeApi28 : EdgeToEdgeApi26() { /** **/ }
@RequiresApi(26)
private open class EdgeToEdgeApi26 : EdgeToEdgeBase() { /** **/ }
private open class EdgeToEdgeBase : EdgeToEdgeImpl { /** **/ }
코드를 통해 확인할 수 있듯이 EdgeToEdgeApi00 클래스는 EdgeToEdgeImpl 인터페이스를 구현한 EdgeToEdgeBase 클래스를 상속하거나 바로 상위의 EdgeToEdgeApi00 클래스를 상속합니다.
변경사항이 생기면 setUp 메서드나 adjustLayoutInDisplayCutoutMode 메서드를 재정의하는 것이죠.
다시 한 번 enableEdgeToEdge 메서드가 수행하는 일을 다음과 같이 정리할 수 있습니다.
- SDK 버전에 맞는
EdgeToEdgeApi00인스턴스를impl에 저장impl.setUp을 호출하여 상태바와 시스템바의 스타일 설정impl.adjustLayoutInDisplayCutoutMode을 호출하여 컷아웃 모드 설정
앞에서 정리한 내용에 따르면 상태바와 네비게이션바의 스타일은 EdgeToEdgeImpl.setUp 메서드에서 설졍됩니다.
fun setUp(
statusBarStyle: SystemBarStyle,
navigationBarStyle: SystemBarStyle,
window: Window,
view: View,
statusBarIsDark: Boolean,
navigationBarIsDark: Boolean
)
이 과정에서 우리는 SystemBarStyle 클래스를 마주하게 됩니다.
SystemBarStyle 은 SystemBarStyle.auto, SystemBarStyle.dark, SystemBarStyle.light 메서드를 사용하여 SystemBarStyle 의 인스턴스를 생성할 수 있습니다.
SystemBarStyle 과 SDK 버전에 따라 시스템바의 색상이 달라지게 됩니다.
다음 글에서는 SystemBarStyle 과 SDK 버전에 따른 시스템바의 색상 변경 과정에 대해 설명하겠습니다.