Android 시스템바 색상 설정 변경하는 방법

컨텐츠 레이아웃이 화면 전체를 차지하도록 설정


WindowCompat.setDecorFitsSystemWindows(window, true or false)
true false
컨텐츠 레이아웃의 범위가 상태 바와 네비게이션 바 영역을 제외한 영역만 차지합니다. 컨텐츠 레이아웃의 범위가 상태 바와 네비게이션 바 영역까지 확장됩니다.
image image

true

false

true와 달리, 레이아웃 계층에서 navigationBarBackgroundstatusBarBackground가 최상위로 올라오게 됩니다.

상태 바와 네비게이션 바 색상 변경


window.apply {
    WindowCompat.setDecorFitsSystemWindows(window, false)
    navigationBarColor = Color.TRANSPARENT
    statusBarColor = Color.TRANSPARENT
}

배경색이 변경되게 됩니다.

상태 바 : GREEN, 네비게이션 바 : GREEN 상태 바 : TRANSPARENT, 네비게이션 바 : TRANSPARENT
  • 상태 바
    • 투명으로 설정하면 DecorView에서 그려지지 않습니다.
  • 네비게이션 바
    • 투명으로 설정하더라도 DecorView에서 그려지게 됩니다.
    • 투명으로 설정하면 배경색이 검은색으로 설정됩니다.

상태 바와 네비게이션 바를 투명하게 하기


window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

아래의 코드와 같은 상태에서 네비게이션 바가 DecorView에서 사라지고 배경색이 투명하게 되는 것과 같습니다.

window.apply {
    WindowCompat.setDecorFitsSystemWindows(window, false)
    navigationBarColor = Color.TRANSPARENT
    statusBarColor = Color.TRANSPARENT
}

뷰의 위치를 시스템 바와 겹치지 않도록 설정하기


window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

위와 같은 상태에서는, 뷰가 시스템 바와 겹치게 됩니다.

겹치는 뷰에 대하여 Margin 또는 Padding을 설정하여 시스템 바와 겹치지 않도록 설정해야 합니다.

1 시스템 바의 높이를 가져옵니다.

// 안드로이드 프레임워크에서 기본적으로 설정되어 있는 값을 통해서 가져올 수 있습니다.
val resources = Resources.getSystem()
val statusBarHeight1 = resources.getDimensionPixelSize(resources.getIdentifier("status_bar_height", "dimen", "android"))
val navigationBarHeight1 = resources.getDimensionPixelSize(resources.getIdentifier("navigation_bar_height", "dimen", "android"))
}

2 뷰에 대하여 Margin 또는 Padding값을 갱신합니다.

  • 이미 지정된 값이 있을 수 있으므로, 기존 값에 시스템 바의 높이를 더해줍니다.
  • top, bottom에 대해서 적용할지 여부는 상황에 따라 선택합니다.
// Margin
val resources = Resources.getSystem()
val statusBarHeight = resources.getDimensionPixelSize(resources.getIdentifier("status_bar_height", "dimen", "android"))
val navigationBarHeight = resources.getDimensionPixelSize(resources.getIdentifier("navigation_bar_height", "dimen", "android"))
root.updatePadding(top = root.paddingTop + statusBarHeight, bottom = root.paddingBottom + navigationBarHeight)         

3 결과

다음 주제

OneActivity 구조에서 Fragment가 변경될 때 마다 시스템 바 설정을 자동으로 변경시키는 방법에 대해 알아보겠습니다.

android_systembar_updating