アプリケーションの種類によってはSystem Barを非表示にしたい場合があります。
例えば、没入したいゲームはStatus Barを非表示にして、システムからの割り込みを無くすことが望ましいでしょう。
System Barはデフォルトでアプリに表示されますが、プログラムで非表示にすることも可能です。
System Barの表示・非表示の制御について紹介します。
目次
View#systemUiVisibilityを使った制御
System barの表示・非表示の制御はView#systemUiVisibilityにフラグをセットすることで行われます。
フラグの動作は表の通りです。
| フラグ SYSTEM_UI_FLAG_* | System Bar 非表示 | System Bar 再表示 |
|---|---|---|
| FULLSCREEN | Status Barの非表示 | 上端からスワイプで再表示 |
| HIDE_NAVIGATION | Navigation Barの非表示 | タッチで再表示 |
| FULLSCREEN or HIDE_NAVIGATION | System Barの非表示 | タッチで再表示 |
| LAYOUT_STABLE or FULLSCREEN | Contentsサイズを変更しない Status Barの非表示 | 上端からスワイプで再表示 |
| LAYOUT_STABLE or HIDE_NAVIGATION | Contentsサイズを変更しない Navigation Barの非表示 | タッチで再表示 |
| LAYOUT_STABLE or FULLSCREEN or HIDE_NAVIGATION | Contentsサイズを変更しない System Barの非表示 | タッチで再表示 |
| IMMERSIVE or FULLSCREEN | Status Barの非表示 | 上端からスワイプで再表示 |
| IMMERSIVE or HIDE_NAVIGATION | Navigation Barの非表示 | 下端からスワイプで再表示 |
| IMMERSIVE or FULLSCREEN or HIDE_NAVIGATION | System Barの非表示 | 上下端からスワイプで再表示 |
| IMMERSIVE_STICKY or FULLSCREEN | Status Barの非表示 | 上端からスワイプで一定時間表示 ※黒の半透明 |
| IMMERSIVE_STICKY or HIDE_NAVIGATION | Navigation Barの非表示 | 下端からスワイプで一定時間表示 ※黒の半透明 |
| IMMERSIVE_STICKY or FULLSCREEN or HIDE_NAVIGATION | System Barの非表示 | 上下端からスワイプで一定時間表示 ※黒の半透明 |
| LAYOUT_HIDE_NAVIGATION | System Bar背面へコンテンツ表示 | |
| ※色はフラグが影響を及ぼす動作を表します。 | ||
ただし、View#systemUiVisibilityはApi30で非推奨になりました。≧Api30はWindowInsetsController#show( )/hide( )メソッドを用います。
System Barの表示・非表示
表示・非表示の実行例です。
非表示の様子は子Viewのレイアウト属性を参照してください。layout_marginとpaddingとgravityを使って実現されている事が分かります。
FULLSCREEN(4)※( )内はフラグの値
Status Barを非表示にします。
非表示にされたStatus Barは上端からのスワイプで再表示できます。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_FULLSCREEN
...
}

※LTRB : Left,Top,Right,Bottom
Class = DecorView
Class = LinearLayout(Contents)
Position = (0, 0)
Size = 320x432
Layout Width, Height = -1,-1
Layout Margin LTRB = 0,0,0,48
Layout Gravity = -1
Padding LTRB = 0,0,0,0
Visibility = 0(Visible)
Class = View(Navigation)
Position = (0, 432)
Size = 320x48
Layout Width, Height = -1,48
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 80(Bottom)
Padding LTRB = 0,0,0,0
Visibility = 0(Visible)
Class = View(Status)
Position = (0, 0)
Size = 320x0
Layout Width, Height = -1,0
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 48(Top)
Padding LTRB = 0,0,0,0
Visibility = 4(Invisible)
HIDE_NAVIGATION(2)
Navigation Barを非表示にします。
非表示にされたNavigation Barは画面のタッチで再表示できます。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_HIDE_NAVIGATION
...
}

※LTRB : Left,Top,Right,Bottom
Class = DecorView
Class = LinearLayout(Contents)
Position = (0, 0)
Size = 320x480
Layout Width, Height = -1,-1
Layout Margin LTRB = 0,0,0,0
Layout Gravity = -1
Padding LTRB = 0,24,0,0
Visibility = 0(Visible)
Class = View(Navigation)
Position = (0, 480)
Size = 320x0
Layout Width, Height = -1,0
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 80(Bottom)
Padding LTRB = 0,0,0,0
Visibility = 4(Invisible)
Class = View(Status)
Position = (0, 0)
Size = 320x24
Layout Width, Height = -1,24
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 48(Top)
Padding LTRB = 0,0,0,0
Visibility = 0(Visible)
LAYOUT_STABLE(256)
System Barが非表示になっても、Contents Viewの位置とサイズは変更されません。
つまり、空いたSystem Barの領域へContents Viewが広がらないので、System Barの表示・非表示の前後でContents Viewの画像が乱れません(変化しません)。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_FULLSCREEN or
SYSTEM_UI_FLAG_HIDE_NAVIGATION or
SYSTEM_UI_FLAG_LAYOUT_STABLE
...
}

※LTRB : Left,Top,Right,Bottom
Class = DecorView
Class = LinearLayout(Contents)
Position = (0, 0)
Size = 320x480
Layout Width, Height = -1,-1
Layout Margin LTRB = 0,0,0,0
Layout Gravity = -1
Padding LTRB = 0,24,0,48
Visibility = 0(Visible)
Class = View(Navigation)
Position = (0, 432)
Size = 320x48
Layout Width, Height = -1,48
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 80(Bottom)
Padding LTRB = 0,0,0,0
Visibility = 4(Invisible)
Class = View(Status)
Position = (0, 0)
Size = 320x24
Layout Width, Height = -1,24
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 48(Top)
Padding LTRB = 0,0,0,0
Visibility = 4(Invisible)
非表示⇒表示の切り替え
System Barを「非表示⇒表示」に切り替えます。
View#systemUiVisibilityに指定したフラグをクリアすれば、System Barが表示された状態に戻ります。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
window.decorView.systemUiVisibility = 0
...
}
System Barの再表示
非表示にしたSystem Barは画面の操作で再表示できます。その操作方法がフラグにより決まります。
再表示の実行例です。
IMMERSIVE(2048)
非表示にされたSystem Barは画面の上部または下部からのスワイプで再表示されます。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_FULLSCREEN or
SYSTEM_UI_FLAG_HIDE_NAVIGATION or
SYSTEM_UI_FLAG_IMMERSIVE
...
}

IMMERSIVE_STICKY(4096)
非表示にされたSystem Barは画面の上部または下部からのスワイプで再表示(黒の半透明)されます。ただし、一定時間の経過後に再び非表示になります。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_FULLSCREEN or
SYSTEM_UI_FLAG_HIDE_NAVIGATION or
SYSTEM_UI_FLAG_IMMERSIVE_STICKY
...
}

System Barの背面へコンテンツ表示
通常、System Barとコンテンツは重なり合いません。この重なり合いを許して、System Barの背面へコンテンツの表示が可能です。
ただし、Sysytem Barを半透明にする必要があります。System Barの背面にあるコンテンツが見えなければ、意味が無いからです。
背面へコンテンツを表示する実行例です。
背面へ表示する様子は子Viewのレイアウト属性を参照してください。layout_marginとpaddingとgravityを使って実現されている事が分かります。
LAYOUT_HIDE_NAVIGATION(512)
System Barの背面にContents Viewが表示されます。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
...
// System Barの背景の透明度を変更
val _SystemBarColor = ContextCompat.getColor(this, R.color.barback)
window.navigationBarColor = _SystemBarColor
window.statusBarColor = _SystemBarColor
...
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<color name="barback">#50ffffff</color>
...
</resources>

※LTRB : Left,Top,Right,Bottom
Class = DecorView
Class = LinearLayout(Contents)
Position = (0, 0)
Size = 320x480
Layout Width, Height = -1,-1
Layout Margin LTRB = 0,0,0,0
Layout Gravity = -1
Padding LTRB = 0,0,0,0
Visibility = 0(Visible)
Class = View(Navigation)
Position = (0, 432)
Size = 320x48
Layout Width, Height = -1,48
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 80(Bottom)
Padding LTRB = 0,0,0,0
Visibility = 0(Visible)
Class = View(Status)
Position = (0, 0)
Size = 320x24
Layout Width, Height = -1,24
Layout Margin LTRB = 0,0,0,0
Layout Gravity = 48(Top)
Padding LTRB = 0,0,0,0
Visibility = 0(Visible)
関連記事:
