본문 바로가기
android

android fullscreen transparent status bar

by Gil 2021. 1. 22.
728x90

위에처럼 FullScreen 이면서, StatusBar가 투명으로 나오는 뷰를 그리고자 한다. 

구글링 결과, 아래 사항들만 적용하면 된다고 한다. 그리고 왠만하면 Java(Kotlin) 코드로 작성하는 것 보다 XML에서 작성하고 Style 적용이 코드 유지보수에 좋아서 시도를 해봤다. 

<item name="android:windowTranslucentStatus">true</item>
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds" tools:targetApi="lollipop">true</item> // 시스템바를 백그라운드에 그린다.
<item name="android:windowFullscreen">true</item>

 

  1. windowTranslucentStatus : StatusBar를 반투명하게 설정한다. 
  2. statusBarColor : StatusBar 색상을 설정한다. (API 21 이상부터 적용 가능)
  3. windowDrawsSystemBarBackgrounds : StatusBar를 백그라운드 위에 그린다. 
  4. windowFullscreen : FullcreenMode 적용한다. 

그런데, 결과물은 내가 예상했던것과 다르게 나왔다. 

아니! 난 투명하게 하고 싶은데, statusBar 색상을 이리저리 바꿔봐도 적용이 안된다. 좌절..


window.apply {
    clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        statusBarColor = Color.TRANSPARENT
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    }
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    }
}

내가 원하는 방향은 아니었지만, Kotlin 코드를 삽입하면서 해결이 되었다. 

  1. clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) : StatusBar를 투명하게 하는 옵션은 색상 변경이 안되니 삭제해야 한다. 
  2. addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) : StatusBar를 Background 위에 그린다. 
  3. statusBarColor = Color.TRANSPARENT : StatusBar 컬러 변경
  4. decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN : FullScreen으로 변경
  5. decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR : StatusBar를 Light 하게 변경 (StatusBar 글자 색상을 어둡게 변경한다.) 
    => 이 옵션도 상당히 중요하다. ColorPrimary 값 등 관련 Stylex.xml 변수들을 모두 바꿔봤지만 적용이 안되고 결국 해당 옵션만 적용되는 걸 확인했다. 

물론, 위에 코드들을 Styles.xml에 적용을 해봤다. 안된다. (FLAG_TRANSLUCENT_STATUS 를 false로도 해보고, 옵션 자체를 안넣어 보기도 했지만 적용이 안된다.)

적용할 앱에 전체 적용이 되어야 하기 때문에, 해당 코드를 BaseActivity 코드에 작성해서 공통적용이 되도록 설정했다. 

 


<참고 자료> 

proandroiddev.com/android-full-screen-ui-with-transparent-status-bar-ef52f3adde63