본문 바로가기

소소한 팁

[Android] 특정화면에서 안드로이드 스테이터스바, 아이콘 색상 변경할 때 겪은 이슈

프로젝트 작업 중 특정 화면에서 스테이터스바 색상을 흰색으로 변경할 일이 있었습니다. 그래서 스테이터스바 색상 변경 코드와

 

window.setStatusBarColor()

 

아이콘 색상 변경하는 코드를

 

window.decorView.systemUiVisibility += View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

 

넣고 앱에 잘 적용된걸 확인한 뒤 다른 작업을 하고 있었는데 QA 도중 OS 버전이 낮은 기기에서 아이콘과 시간이 보이지 않는 이슈를 발견했습니다.

 

 

스테이터스바에 있는 아이콘과 시간이 사라졌다???

 

왜 그런가 하고 보았더니 색상 변경하는 코드는 흰색으로 잘 적용이 되었는데 스테이터스바에 있는 아이콘, 글자 색깔은 OS 버전 6 (API 23) 이상 부터 바꿀 수 있었고 해당 기기는 OS 버전 6 미만이어서 흰색 배경에 아이콘 색상도 흰색으로 나와 아무것도 보이지 않는 현상이었습니다. 프로젝트가 안드로이드 OS 버전 5 (API 21) 부터 지원하고 스테이터스바 영역색깔 바꾸는 코드도 API 21부터 변경가능해서 잘 될거라 믿었던 제 실수 였습니다. 

 

디자인 요구사항은 흰색 스테이터스 바에 검은색 아이콘 색상이었는데 API 23 미만에서는 흰색 아이콘 색상밖에 적용할 수 없어 달리 방법이 없어보였습니다. 나중에 사용자가 쓰는 기기 평균 OS 버전이 올라가 min API 를 23으로 올릴 수 있다면 자연스럽게 해결될 것 같지만 현재는 min API 가 21이므로 어쩔 수 없이 사용자 기기의 OS 버전에 따라 분기처리해서 API 23 이하 버전에서는 스테이터스바 색상을 흰색 대신 다른 색으로 바꾸는 방향으로 문제를 해결했습니다.

 

fun Activity.setStatusBarColorDefault() {
    window.apply {
        var defaultStatusBarColor: Int

        // setStatusBarColor() 함수를 사용하려면 아래 두 조건을 만족해야 함.
        clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 현재 API 가 23 이상인지 체크
            defaultStatusBarColor = getColorRes(statusBarColor_23)
            // 스테이터스바 아이콘 색상 변경 코드, API 23 이상부터 해당플래그 적용 가능
            decorView.systemUiVisibility += View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        } else {
            // API 23 미만이면 다른 스테이터스바 색상 적용
            defaultStatusBarColor = getColorRes(statusBarColor_21)
        }

        defaultStatusBarColor = getColorRes(statusBarColor_21)
        statusBarColor = defaultStatusBarColor // 스테이터스바 색상변경 코드, API 21 이상 부터 적용 가능
    }
}

 

 

왼쪽은 OS. 9 (API 28), 오른쪽은 OS. 5 (API 21)

 

정리하면 다음과 같습니다. 

 

  • Window.setStatusBarColor() 함수는 API 21 이상부터 사용 가능
  • 스테이터스바 아이콘 색상을 흰색으로 변경해주는 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 플래그는 API 23 부터 사용 가능
  • 그래서 만약 앱의 스테이터스바 색상이 흰색으로 디자인되어있다면 API 23 미만에서는 스테이터스바 색상을 다른 색으로 바꾸어야 함. 안그러면 스테이터스바도 흰색, 스테이터스바 아이콘도 흰색이라 아무 것도 안보일 수 있음

이상 소소한 팁이었습니다.

 


(추가)

 

블로그글 정리하다보니 Android11 을 타겟팅하는 앱에서는 

 

decorView.systemUiVisibility += View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

 

이렇게 systemUivisibility 에 플래그 넣는 코드가 deprecated 되었네요. 나중에 시간날 때 이부분도 공부해서 정리해보겠습니다.


 

'소소한 팁' 카테고리의 다른 글

[Andorid] 커스텀 토스트 만들기  (0) 2020.03.20