Androidでナビゲーションバーを一時的に隠したい

  • 7
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

一時的にナビゲーションバーを隠す実装が必要だったので、色々試してみました。

SYSTEM_UI_FLAG_HIDE_NAVIGATION

呼ばれた画面でナビゲーションバーを隠す方法。

View view = getWindow().getDecorView();
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

ただ、SYSTEM_UI_FLAG_HIDE_NAVIGATIONだけだとバーを一時的に隠すだけ(=画面をタッチしたりインタラクションがあるとバーが下から現れる)ので、SYSTEM_UI_FLAG_IMMERSIVEも一緒に書いてあげると良い感じになります。

SYSTEM_UI_FLAG_IMMERSIVE

ナビゲーションバーを隠して、インタラクションがあっても非表示にし続ける方法。

View view = getWindow().getDecorView();
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE);

Immersiveには「没入」という意味があって、「バーを非表示にし続けることでユーザを邪魔しないでアプリに没入させる」という意図があるっぽい。

だがしかし、このSYSTEM_UI_FLAG_IMMERSIVE、API level 19 (Android 4.4: KitKat) からのサポートなので、Android 4.3以下では使えず。なんてこった。
仕方ないので、理想動作はAndroid 4.4以上でのみ実現としました。

IMMERSIVE効かない問題

SYSTEM_UI_FLAG_IMMERSIVEをセットしてる画面でダイアログを表示すると、隠れていたはずのナビゲーションバーが表示されてしまう問題がありました。:pensive:
前面に別のWindow貼ってるのでそりゃそうだって感じですが、ダイアログ側に下記のように書くと解消できました。(ダイアログはDialogFragmentを継承しています。)

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    Window window = getDialog().getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}

参考サイト