LoginSignup
18
12

More than 5 years have passed since last update.

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

Posted at

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

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);
}

参考サイト

18
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12