이 과정에서는 다양한 버전의 Android에서 상태 표시줄을 숨기는 방법을 설명합니다. 상태 표시줄 (및 필요한 경우 탐색 메뉴)을 숨기면 콘텐츠가 디스플레이 공간을 더 많이 사용하므로 더 몰입도 높은 사용자 환경을 제공할 수 있습니다.
그림 1은 상태 표시줄이 표시된 앱을 보여줍니다.
![시스템 표시줄](https://developer.android.google.cn/static/images/training/status_bar_show.png?authuser=8&hl=ko)
그림 1. 상태 표시줄 표시됨.
그림 2는 상태 표시줄이 숨겨진 앱을 보여줍니다. 작업 표시줄도 숨겨졌습니다. 상태 표시줄이 없으면 작업 모음을 표시할 수 없습니다.
![시스템 표시줄](https://developer.android.google.cn/static/images/training/status_bar_hide.png?authuser=8&hl=ko)
그림 2. 상태 표시줄 숨겨짐.
Android 4.0 이하에서 상태 표시줄 숨기기
Android 4.0 (API 수준 14) 이하에서는 WindowManager
플래그를 설정하여 상태 표시줄을 숨길 수 있습니다. 이 작업은 프로그래매틱 방식으로 하거나 앱의 매니페스트 파일에서 활동 테마를 설정하여 할 수 있습니다. 앱에서 상태 표시줄을 항상 숨겨야 하는 경우 앱의 매니페스트 파일에서 활동 테마를 설정하는 것이 좋습니다. 엄밀히 말하면 원하는 경우 프로그래매틱 방식으로 테마를 재정의할 수 있습니다. 예:
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ... </application>
활동 테마를 사용하면 다음과 같은 장점이 있습니다.
- 프로그래밍 방식으로 플래그를 설정하는 것보다 유지 관리가 쉽고 오류가 적음.
- 이렇게 하면 앱의 기본 활동을 인스턴스화하기 전에 UI를 렌더링하는 데 필요한 정보가 시스템에 있으므로 UI 전환이 더 원활해집니다.
프로그래매틱 방식으로 WindowManager
플래그를 설정할 수도 있습니다.
이 방법을 사용하면 사용자가 앱과 상호작용할 때 더 쉽게 상태 표시줄을 숨기거나 표시할 수 있습니다.
Kotlin
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // If the Android version is lower than Jellybean, use this call to hide // the status bar. if (Build.VERSION.SDK_INT < 16) { window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) } setContentView(R.layout.activity_main) } ... }
Java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // If the Android version is lower than Jellybean, use this call to hide // the status bar. if (Build.VERSION.SDK_INT < 16) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } setContentView(R.layout.activity_main); } ... }
활동 테마를 통해서든 프로그래매틱 방식으로든 WindowManager
플래그를 설정하면 앱에서 플래그를 지우지 않는 한 플래그가 계속 적용됩니다.
FLAG_LAYOUT_IN_SCREEN
를 사용하여 FLAG_FULLSCREEN
를 사용 설정했을 때 사용 가능한 것과 동일한 화면 영역을 사용하도록 활동 레이아웃을 설정할 수 있습니다. 이렇게 하면 상태 표시줄이 숨겨지거나 표시될 때 콘텐츠 크기가 조절되지 않습니다.
Android 4.1 이상에서 상태 표시줄 숨기기
Android 4.1 (API 수준 16) 이상에서는 setSystemUiVisibility()
를 사용하여 상태 표시줄을 숨길 수 있습니다.
setSystemUiVisibility()
는 개별 뷰 수준에서 UI 플래그를 설정합니다. 이러한 설정은 창 수준으로 집계됩니다. setSystemUiVisibility()
를 사용하여 UI 플래그를 설정하면 WindowManager
플래그를 사용하는 것보다 시스템 표시줄을 더 세밀하게 제어할 수 있습니다. 다음은 상태 표시줄을 숨기는 스니펫입니다.
Kotlin
// Hide the status bar. window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN // Remember that you should never show the action bar if the // status bar is hidden, so hide that too if necessary. actionBar?.hide()
Java
View decorView = getWindow().getDecorView(); // Hide the status bar. int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); // Remember that you should never show the action bar if the // status bar is hidden, so hide that too if necessary. ActionBar actionBar = getActionBar(); actionBar.hide();
다음 내용을 참고하세요.
- UI 플래그가 지워진 후 (예: 활동에서 나가기) 막대를 다시 숨기려면 앱에서 플래그를 재설정해야 합니다. 앱이 적절하게 응답할 수 있도록 UI 가시성 변경을 수신 대기하는 방법에 관한 설명은 UI 공개 상태 변경에 응답을 참고하세요.
- UI 플래그를 설정하면 차이가 발생합니다. 활동의
onCreate()
메서드에서 시스템 표시줄을 숨기고 사용자가 홈을 누르면 시스템 표시줄이 다시 표시됩니다. 사용자가 활동을 다시 열면onCreate()
가 호출되지 않으므로 시스템 표시줄이 계속 표시됩니다. 사용자가 활동에 들어오고 나가도 시스템 UI 변경사항이 유지되도록 하려면onResume()
또는onWindowFocusChanged()
에서 UI 플래그를 설정합니다. setSystemUiVisibility()
메서드는 호출하는 뷰가 표시되는 경우에만 효과가 있습니다.- 뷰에서 벗어나면
setSystemUiVisibility()
로 설정된 플래그가 지워집니다.
콘텐츠를 상태 표시줄 뒤에 표시
Android 4.1 이상에서는 상태 표시줄이 숨겨지거나 표시될 때 콘텐츠 크기가 조정되지 않도록 애플리케이션의 콘텐츠가 상태 표시줄 뒤에 표시되도록 설정할 수 있습니다.
이렇게 하려면 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
를 사용하세요.
앱에서 안정적인 레이아웃을 유지하도록 SYSTEM_UI_FLAG_LAYOUT_STABLE
를 사용해야 할 수도 있습니다.
이 접근 방식을 사용할 경우 앱 UI의 중요한 부분 (예: 지도 애플리케이션의 내장 컨트롤)이 시스템 표시줄에 가려지지 않도록 하는 것은 개발자의 책임입니다. 가려지면 앱을 사용하지 못하게 될 수 있습니다. 대부분의 경우 android:fitsSystemWindows
속성을 XML 레이아웃 파일에 추가하고 true
로 설정하여 이 작업을 처리할 수 있습니다. 이렇게 하면 상위 ViewGroup
의 패딩이 조정되어 시스템 창을 위한 공간이 확보됩니다. 대부분의 애플리케이션에서는 이렇게 하면 충분합니다.
그러나 원하는 앱 레이아웃을 가져오기 위해 기본 패딩을 수정해야 하는 경우도 있습니다. 창의 '콘텐츠 인셋'으로 알려진 공간을 차지하는 시스템 표시줄을 기준으로 콘텐츠가 배치되는 방식을 직접 조작하려면 fitSystemWindows(Rect insets)
를 재정의합니다.
창의 콘텐츠 인셋이 변경되면 그에 따라 창에서 콘텐츠를 조정할 수 있도록 뷰 계층 구조에서 fitSystemWindows()
메서드를 호출합니다. 이 메서드를 재정의하면 원하는 대로 삽입 (및 따라서 앱의 레이아웃)을 처리할 수 있습니다.