[Android] Android 15 대응 - EdgeToEdge: 2. StatusBar 및 NavigationBar

배경색

statusBar의 배경색을 지정할 수 있는 window.statusBarColor는 Android 15(API 35)에서 지원 종료되었다.

If the app targets VANILLA_ICE_CREAM or above, the color will be transparent and cannot be changed. - Window#setStatusBarColor 주석

VANILLA_ICE_CREAM 이상을 타겟팅한다면 색상은 투명이고 이 값을 사용할 수 없다고 가이드되어 있다.

따라서 status bar와 navigation bar 영역의 색상을 바꾸려면 setOnApplyWindowInsetsListener에 넘겨주는 findViewById(android.R.id.content)의 배경색을 바꿔야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ViewCompat.setOnApplyWindowInsetsListener(
findViewById(android.R.id.content)
) { view, insets ->

val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.setPadding(
systemBars.left,
systemBars.top,
systemBars.right,
systemBars.bottom
)

view.setBackgroundColor(
ContextCompat.getColor(view.context, R.color.white)
)

insets
}

이는 뷰의 배경색이기 때문에 padding을 설정해야 보이게 된다.

또한 status bar와 navigation bar의 색상을 다르게 하려면 아래 코드만으로는 안되고, 또 다른 조치를 취해줘야할 것으로 보인다.

statusBar는 위 코드와 같이 지정하고, navigationBar는 Activity의 최상위 뷰의 background에 컬러값 옵션과 paddingBottom을 설정함으로써 statusBar와 navigationBar의 색상을 다르게 처리하였다.

1
2
3
4
5
6
7
8
9
10
11
12
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.setupWindowInsetsClassroom()
ViewCompat.setOnApplyWindowInsetsListener(window.findViewById(android.R.id.content)) { view, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.setBackgroundColor(ContextCompat.getColor(view.context, R.color.common_blue_color))
view.setPadding(0, systemBars.top, 0, 0)
binding.slidingPanelLayout.setPadding(0, 0, 0, systemBars.bottom)
insets
}
...
}

아이콘 색상

Android 15(API 35)에서는 다크모드에서의 흰색과 라이트 모드에서의 회색으로만 설정할 수 있다.

이를 설정하기 위해서는 아래 두 가지 setter를 사용한다.

  • InsetsController#isAppearanceLightStatusBars(boolean)
  • InsetsController#isAppearanceLightNavigationBars(boolean)
1
2
3
4
5
6
7
8
WindowCompat.getInsetsController(this, this.decorView).apply {
// 배경이 밝으니 스테이터스 바의 아이콘 색상을 회색으로 설정한다. //
isAppearanceLightStatusBars = true
// 배경이 밝으니 네비게이션 바의 아이콘 색상을 회색으로 설정한다. //
isAppearanceLightNavigationBars = true
// 3버튼 네비 바의 배경이 완전 투명 //
isNavigationBarContrastEnforced = false
}

InsetsController에 관해서는 아래에서 설명한다.

제스처 네비게이션 바

⚠️ 픽셀 기기에서는 제스처 네비게이션 바의 색상이 제제대로 처리되지 않는 것 같음. 흰배경이 뒤에 있는데도 흰색으로 설정되어있음.

제스처 네비게이션의 바 색상은 흰색↔회색으로 변하는데, 이는 아래 인용과 같이 시스템에서 알아서 변경해준다.

동작 탐색 모드: 시스템은 시스템 표시줄의 콘텐츠가 뒤에 있는 콘텐츠를 기반으로 색상을 변경하는 동적 색상 조정을 적용한다. (시스템 표시줄 색상 변경하기 영상 참고)

[Android] Android 15 대응 - EdgeToEdge: 2. StatusBar 및 NavigationBar

https://dl137584.github.io/2025/06/25/034-android15-edge-to-edge-02-statusbar-and-navigationbar/

Author

LEEJS

Posted on

2025-06-25

Updated on

2026-01-10

Licensed under

댓글