1、概述

由于我们开发的应用是不需要显示出来导航栏的,避免导航栏显示出来了,无法预估用户做什么操作,直接可能把我们的应用给干掉了。首先我们的 APP 是沉浸式的,所有的 Activity 中已经隐藏掉了导航栏,但是如果弹出一个 Dialog 的话,还是会将导航栏给显示出来,具体原因是因为 Dialog 的 Window 抢走了焦点,Window 中的 DecorView 状态改变导致了又重新把底部导航栏给显示出来了。

2.设置 Window

所有的视图 View 都是显示加载在 Window 上面的,Activity 的视图也是,Dialog 的视图也是,Activity 的能够隐藏导航栏也就是设置了 Window 的属性,所以 Dialog 也是一样的。在 Dialog 显示出来之前,让 Window 失去焦点,然后再设置 DecorView 属性隐藏导航栏,最后因为显示 Dialog 之前设置失去了焦点,还需要设置回来 Dialog 的焦点,否则 Dialog 的事件会穿透到 Activity 。设置代码如下。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
        super.show();
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
                
getWindow().getDecorView().setSystemUiVisibility(uiOptions);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);