📱

Android : ナビゲーションバーとステータスバーを非表示(フルスクリーン化)

2022/10/02に公開

はじめに

Androidアプリで、ステータスバーやナビゲーションバーを非表示してフルスクリーン化する必要がありました。そのやり方について簡単にまとめます。

やり方

コード

例えば表示させたい画面で下記のように記述します。
API 29以下と30以上で手順が変わるので、if分で分岐させています。


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // API 30以上の場合
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            window.decorView.windowInsetsController?.apply {
                // systemBars : Status barとNavigation bar両方
                hide(WindowInsets.Type.systemBars())
                // hide(WindowInsets.Type.statusBars())
                // hide(WindowInsets.Type.navigationBars())
                systemBarsBehavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            }
        // API 29以下の場合
        } else {
            window.decorView.systemUiVisibility = (
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            or View.SYSTEM_UI_FLAG_FULLSCREEN)
        }

    }
}

API 30以上の場合では、「WindowInsetsController」を使用します。


window.decorView.windowInsetsController?.apply {
    // systemBars : ステータスバーとナビゲーションバーの両方
    hide(WindowInsets.Type.systemBars())
    // hide(WindowInsets.Type.statusBars())
    // hide(WindowInsets.Type.navigationBars())
    systemBarsBehavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}

ステータスバーとナビゲーションバーの両方を非表示にする場合は

hide(WindowInsets.Type.systemBars())

それぞれ片方の場合は、下記のどちらかを記述します。

// ステータスバーの非表示
hide(WindowInsets.Type.statusBars())
// ナビゲーションバーの非表示
hide(WindowInsets.Type.navigationBars())

下記のように指定すると画面をスワイプした際に一定時間、システムバーを表示した後に非表示になる動作になります。

systemBarsBehavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

その他に下記を指定できます。

  • BEHAVIOR_SHOW_BARS_BY_TOUCH (デフォルト設定)
  • BEHAVIOR_SHOW_BARS_BY_SWIPE

API 29以下の場合は下記のように記述します

window.decorView.systemUiVisibility = (
	View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
		// ナビゲーションバーが非表示であるレイアウトにする
		or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
		// ステータスバーが非表示であるレイアウトにする
		or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
		// ナビゲーションバーの非表示
		or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
		// ステータスバーの非表示
		or View.SYSTEM_UI_FLAG_FULLSCREEN)

おわりに

このフルスクリーン化する処理を各画面ごとに記述するとコードが読みづらくなるので、共通化したほうが良いです。そのやり方についても、後日、解説します。

Discussion