需求
在一个底部有虚拟导航栏NavigationBar的手机上,需要全屏显示,完全隐藏顶部的StatusBar和底部的NavigationBar,在任何时候都不需要其显示出来.
异常现象
当给目标Activity设置好全屏代码
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_FULLSCREEN;
window.getDecorView().setSystemUiVisibility(uiOptions);
后,可以正常显示全屏, 也不会出什么问题.
但是,如果弹出了一个DialogFragment的时候,底部就会弹出虚拟导航栏,且当DialogFragment消失的时候也不会跟着消失, 就很麻烦.
解决办法
1.在DialogFragment的onViewCreated方法里加入一个FLAG参数
getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
这样弹出来的DialogFragment就不会获取到系统焦点,也就不会显示底部导航拉了.
但是这会引起一个问题, 就是点击DialogFragment的周围,他不会自动dismiss消失,所有有了第三步.
2.在DialogFragment显示后,去掉这个FLAG_NOT_FOCUSABLE.去掉这个标志后,DialogFragment重新获取到焦点,所以点击周围可以关闭掉他. 同时,底部导航栏这个时候又会显示出来, 所以要在DialogFragment显示的onShow()的时候,再次调用设置全屏的方法,设置为全屏.
getDialog().setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
//清除FLAG后,部分手机会再次显示底部导航栏,所以需要再次设置为全屏
Util.fullScreen(window);
}
});