目的
- ナビゲーションバーが邪魔で基本常に非表示にしておきたい
方法
以下の処理を実装する。
MainActivity.kt
override fun onStart() {
super.onStart()
hideSystemUI()
}
fun hideSystemUI() {
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)
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) hideSystemUI()
}
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
「外部からスワイプしないとナビゲーションバーが出てこない上に、出てきたナビゲーションは半透明になる」というモードを指す。
なお、ナビゲーションバーは普通がいいという場合はSYSTEM_UI_FLAG_IMMERSIVEを使う。
View.SYSTEM_UI_FLAG_FULLSCREEN
ステータスバーを非表示にする。
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
ナビゲーションバーを非表示にする
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
ナビゲーションバーが非表示になった時にレイアウトが崩れないようにする。
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
ステータスバーが非表示になった時にレイアウトが崩れないようにする。
onWindowFocusChangedでhideSystemUIする理由
これがないとDialogを表示するタイミングで再度ナビゲーションバーが表示されてしまう。
それでもDialogFragment表示時にナビゲーションが表示されてしまう場合
私は表示されしまったので以下の実装を行い対処した。
このためにBaseDialogFragmentができてしまったのであまり良い方法ではないかも。
BaseDialogFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
hideSystemUI()
}
// ソフトウェアキーの非表示
private fun hideSystemUI() {
dialog?.window?.setFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
)
activity?.window?.decorView?.systemUiVisibility?.let {
dialog?.window?.decorView?.setSystemUiVisibility(it)
}
dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
}
参考
全画面モードを有効にする
https://developer.android.com/training/system-ui/immersive