一時的にナビゲーションバーを隠す実装が必要だったので、色々試してみました。
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
をセットしてる画面でダイアログを表示すると、隠れていたはずのナビゲーションバーが表示されてしまう問題がありました。
前面に別のWindow貼ってるのでそりゃそうだって感じですが、ダイアログ側に下記のように書くと解消できました。(ダイアログはDialogFragment
を継承しています。)
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Window window = getDialog().getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
参考サイト
- KitKat (Android 4.4) の UI について
http://y-anz-m.blogspot.jp/2013/11/kitkat-android-44-ui.html - Android Immersive モードを使ってみた
http://extra-vision.blogspot.jp/2016/04/android-immersive.html