问题描述
今天在开发的时候遇到了一个问题,在进入Activity设置全屏并隐藏底部导航栏后,当我调用自定义Dialog的show方法后,底部导航栏会弹出来,导致交互很丑陋。
在此记录一下如何处理此情况
解决方法
- 取消弹窗获取焦点的能力,避免弹出时触发自动聚焦
public static void focusNotAle(Window window) {
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
- 设置弹窗window属性为全屏
public static void hideNavigationBar(Window window) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
window.getDecorView().setOnSystemUiVisibilityChangeListener(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);
});
}
- 弹窗show以后重新设置弹窗获取焦点
public static void clearFocusNotAle(Window window) {
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
以上全部总结起来使用为:
val dialog = TestDialog(activity)
StatusBarUtil.focusNotAle(dialog.window)
StatusBarUtil.hideNavigationBar(dialog.window)
dialog.show()
StatusBarUtil.clearFocusNotAle(dialog.window)