Android Window
보통 , Activity 화면에서 status bar, navigation bar 그리고 사용자 view 3가지를 보여준다. 각각 component 들은 서로 다른 window를 가지고 있다. status bar 를 위한 window ( battery, rssi, time 표시 .. ) , navigation bar 를 위한 window ( 햄버거 아이콘, back btn, menu button 등 ) 등 이 모든 window를 WindowManager에 의해서 제어되고 있다.
Window란?
Window는 뭔가를 그려낼 수 있는 화면이다. 기본적으로 액티비티 단위 마다 각자의 WindowManager를 가지고 있고, WindowManager에 의해 Window들이 관리 된다.
액티비티 내에 Window 구성도는 다음 그림과 같다.
![](https://blog.kakaocdn.net/dn/yNa4W/btsLJBTOW36/tm4XU7b0bMSp2FpsPLaGWk/img.png)
각 Window는 동일한 레벨로 존재한다.
하지만 위 그림은 정확한 그림은 아니다. 위 그림은 각 Window별로 동일한 레벨로 있다는 것을 나타내기 위한 그림이고, 사실은 아래의 그림이 정확한 그림이다.
![](https://blog.kakaocdn.net/dn/JFCcq/btsLJumR5Ce/v5rTORbYx0DotR3ButRaIK/img.png)
사실 Activity의 xml이 그려질 Window의 크기는 status bar, navigation bar의 영역을 포함 시킬 정도의 전체 사이즈를 갖고 있다.
하지만 우리가 실제 xml을 통해 레이아웃을 넣으면, status bar와 navigation bar의 중간에 위치하게 된다.
그게 가능한 이유는 자동으로 Activity에서 Window의 상단, 하단 영역에 대해서 Padding값을 넣어주기 때문이다.
그래서 우리가 별도의 설정을 하지 않으면 아래와 같이 레이아웃이 그려지게 된다.
![](https://blog.kakaocdn.net/dn/KKy4i/btsLHr6wXrg/XaZfrXd6e14Ox90iCFR8UK/img.png)
코드를 통해 확인해봐도 동일한 결과입니다.
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
val rootView = findViewById<ViewGroup>(R.id.root)
val statusBarHeight = ViewCompat.getRootWindowInsets(rootView)?.getInsets(WindowInsetsCompat.Type.statusBars())?.top
val navigationBarHeight = ViewCompat.getRootWindowInsets(rootView)?.getInsets(WindowInsetsCompat.Type.navigationBars())?.bottom
Log.e("godgod", "${window.decorView.measuredHeight}")
Log.e("godgod", "${rootView.measuredHeight}")
Log.e("godgod", "${rootView.measuredHeight + statusBarHeight + navigationBarHeight}")
}
![](https://blog.kakaocdn.net/dn/Mq5bV/btsLJhgZvZJ/KkrLnK5RAdvrHL2ay6IPEK/img.png)
DecorView
DecorView 는 Activity 의 제일 상단 뷰 ( root 뷰)로 Window의 배경을 유지하고 있다.
Activity 에서 setContentView 수행시 안드로이드는 Activity Window에 Activity 뷰를 add 한다.
DecorView는 주로 아래와 같은 곳에 사용을 한다.
window.apply {
decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}
시스템 status bar 아이콘 색상을 바꾸기 위해서 decorView를 통해서 flag를 설정해야한다. light status bar 를 지정하면 회색아이콘 그렇지 않으면 흰색 아이콘이 설정이 된다.
- SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: 전체 화면 모드 (앱의 콘텐츠가 화면 상단까지 확장)
- SYSTEM_UI_FLAG_LIGHT_STATUS_BAR: Light 배경일 때 어두운 아이콘으로 표시
Window Flags
FLAG_DRAWS_SYSTEM_BAR_BACKGROUND : system bar 의 배경을 우리의 window 가 책임을 지겠다고 system에게 알려주는 역할
window.apply {
decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
addFlags(WindowManager.LayoutParams.FLAG_DRAW_SYSTEM_BAR_BACKGROUDND)
statusBarColor = Color.Red }
시스템 statusBar 색상으로 Red로 지정.
![](https://blog.kakaocdn.net/dn/84Lk3/btsLIoHVQtc/qSBMo90GqGk2G1pFZhSCYK/img.png)
참고자료
https://proandroiddev.com/android-full-screen-ui-with-transparent-status-bar-ef52f3adde63
Android: Full Screen UI with Transparent Status Bar
Activities, the building block of any Android app. Something so simple, yet so complex. Here we are going to talk about something similar…
proandroiddev.com
https://medium.com/@yonghan_89267/android-window-8c2edbcdebe8
Android Window
Android Window
medium.com
https://medium.com/@saqwzx88/android-window-a-to-z-bed9309ea98b
Android Window A to Z
보통, Activity 화면에서 status bar, navigation bar 그리고 사용자 view 3가지를 보여줍니다. 각각 component 들은 서로 다른 window를 가지고 있습니다. status bar 를 위한 window (…
medium.com
'Android > Android 기초' 카테고리의 다른 글
[Android] 태스크 (Task)와 백 스택(Back Stack) (2) | 2024.12.18 |
---|---|
[Android] 왜 Activity 대신 Fragment를 사용해야할까? (0) | 2024.12.16 |
[Android] Fragment Manager (0) | 2024.12.16 |
[Android] Theme vs Style (3) | 2024.10.27 |
[Android] 메모리 누수 & 분석 (0) | 2024.06.03 |