📱
Android : ナビゲーションバーとステータスバーを非表示(フルスクリーン化)
はじめに
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