很多时候,我们的页面隐藏了虚拟导航栏,然后在这个activity底部弹一个dialog,这个时候,虚拟导航栏会重新显示。
网上有一个好的解决方案:https://blog.youkuaiyun.com/lckj686/article/details/83750425,验证可行。
但是还需要补全下逻辑:
显示dialog 需要判断一下 虚拟导航栏是否显示。如果本来显示,就不要隐藏;如果不显示(全屏),弹dialog时需要再次隐藏,否则虚拟导航栏会闪现。
核心代码如下:
/**
*显示dialog
*/
void show() {
if(checkNavigationBarShow(context,window)) {
XXXDialog.show();
} else {
NavigationBarUtil.focusNotAle(window);
XXXDialog.show();
NavigationBarUtil.hideNavigationBar(window);
NavigationBarUtil.clearFocusNotAle(window);
}
}
public class NavigationBarUtil {
/**
* 隐藏虚拟导航栏
* @param window
*/
static public void hideNavigationBar(Window window) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
window.getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
//布局位于状态栏下方
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
//全屏
View.SYSTEM_UI_FLAG_FULLSCREEN |
//隐藏导航栏
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
if (Build.VERSION.SDK_INT >= 19) {
uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
} else {
uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
window.getDecorView().setSystemUiVisibility(uiOptions);
}
});
}
/**
* dialog 需要全屏的时候用,和clearFocusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
* @param window
*/
static public void focusNotAle(Window window) {
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
/**
* dialog 需要全屏的时候用,focusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
* @param window
*/
static public void clearFocusNotAle(Window window) {
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
/**
* 判断一下虚拟导航栏是否显示
* @param window
*/
public static boolean checkNavigationBarShow(@NonNull Context context, @NonNull Window window) {
int systemUiVisility = ((Activity)context).getWindow().getDetectorView().getSystemUiVisilility();
if(systemUiVisility & (View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION))==0) {
return true;
}
return false;
}
}
另外将activity设置全屏,隐藏虚拟导航栏:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}