반응형
Status Bar, Navigation Bar 없애기
앱을 만들다 보면 상태표시줄과 네비게이션 바 없이 전체화면으로 출력하고 싶을 때가 있다.
이럴 때 window.decorView.systemUiVisibility를 통해 전체화면으로 만들 수 있다.
API 30 이후로는 systemUiVisibility가 Deprecated 되어서 windowInsetsController를 대신 사용해야 한다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.setDecorFitsSystemWindows(false)
window.insetsController?.hide(WindowInsets.Type.systemBars() or WindowInsets.Type.navigationBars())
window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
else {
window.decorView.systemUiVisibility =
(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
View.SYSTEM_UI_FLAG_FULLSCREEN or
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
}
AIDL이나 Intent를 통해 다른 앱이 호출되면 다시 Status Bar와 Navigation Bar가 되돌아올 수 있다.
이럴 땐 위의 코드를 onWindowFocusChanged 안에 넣으면 다른 앱이 종료될 때 자동으로 네비게이션 바도 사라진다.
override fun onWindowFocusChanged(hasFocus: Boolean) {
if(!hasFocus) return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.setDecorFitsSystemWindows(false)
window.insetsController?.hide(WindowInsets.Type.systemBars() or WindowInsets.Type.navigationBars())
window.insetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
else {
window.decorView.systemUiVisibility =
(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
View.SYSTEM_UI_FLAG_FULLSCREEN or
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
}
}
반응형
'Tips > Android' 카테고리의 다른 글
[Android] socket failed: EPERM (Operation not permitted) 해결하기 (0) | 2022.09.07 |
---|---|
[Android] RecyclerView 스크롤 비활성화 (0) | 2022.05.17 |
[Android] Vibrator 클래스로 진동 제어하기 (0) | 2022.05.16 |
[Android] currentTimeMillis로 절대시간 구하기 (0) | 2022.05.03 |
[Android] Binding 사용 시 모든 요소가 아무 동작도 안할 때 (0) | 2022.02.09 |