오늘도 삽질중

Android Status bar 투명처리 본문

안드로이드

Android Status bar 투명처리

Choi3950 2021. 1. 26. 16:04
반응형

상태바를 투명하게 만드는 방법은 여러 블로그에서 다루고 있습니다.

저 또한 해당방법으로 적용한 결과 2가지 문제점이 발생했습니다.




1. 상태바의 시간,아이콘 까지 투명처리 되어 보이지 않는다.

2. 상단에 뷰를 추가할 경우 상태바 영역까지 겹쳐진다.



해당 문제가 발생한 스크린샷입니다.

우선 시간이나 아이콘은 투명처리 되어 안보이는 상태이며, 제가 터치로 상태바를 임시로 보인 상황입니다.

잘 보시면 상단아이콘 버튼이 상태바에 걸려 디자인 가이드대로 작업 진행이 안됩니다.





 제가 원하는 동작방식은 

1. 배경화면과 대조되어 상태바의 시간이나, 아이콘 색상이 변경되어야 한다.

2. 상태바의 영역은 유지되어 뷰를 배치해도 영역을 침범해서는 안된다.




위 2가지 조건을 충족하도록 작업을 진행해보겠습니다.




참고로 해당 방법은 롤리팝 이후부터 원하는 대로 동작됩니다.

롤리팝 이전에는 기존 스택오버플로우 코드를 참고하여 작업했으니 참고해주세요.





우선 Style.xml 을 따로 건드리지 않았습니다.

기존 그대로 사용합니다.

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>





그 다음 Activity 의 onCreate 에 해당 코드를 추가합니다.

    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)


if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = ContextCompat.getColor(this, R.color.colorAccent)
} else {
//검정계열일 경우 주석처리
//흰색의 밝은 계열일 경우 주석해제
// window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

//바인딩을 사용하지 않는다면
window.statusBarColor =
((findViewById<ViewGroup>(android.R.id.content)).getChildAt(0).background as ColorDrawable).color

//바인딩을 사용한다면
window.statusBarColor = (binding.root.background as ColorDrawable).color

}

}

주석을 보시면 충분히 상황에 맞게 사용하실 수 있을꺼라 생각합니다.

저는 해당 코드를 모든 Activity가 상속해서 사용하는 BaseActivity에 추가했습니다.





해당 코드를 사용하게 되면 꼭! 해주셔야 하는 작업이 있습니다.

바로 해당 xml 의 최상위 그룹뷰에 백그라운드를 설정해야 합니다.

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000"
android:paddingStart="16dp"
android:paddingEnd="16dp">

백그라운드를 설정하지 않을경우 크래쉬가 발생하여 앱이 종료됩니다.

그러니 반드시 백그라운드를 설정해주시는걸 잊지 마세요.







백그라운드 흰색계열 ( bacogrund="#fff")






백그라운드 검정계열 ( bacogrund="#000")









위 코드에 주석을 달아놨지만 바탕화면이 검정계열일 경우

window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR

이 부분을 꼭 주석처리하셔야 상태바에 흰색으로 대조되어 확인이 가능합니다.

이유는 찾아봤는데 잘 모르겠네요. 아시는 분은 알려주시면 감사하겠습니다.

반응형
Comments