Android 在隐藏虚拟导航栏的activity底部 show Dialog ,虚拟导航栏闪现问题解决

博客指出在Android页面隐藏虚拟导航栏后,底部弹dialog会使导航栏重新显示。给出网上可行解决方案链接,还需补全逻辑,即显示dialog时要判断导航栏是否显示,全屏时弹dialog需再次隐藏,避免闪现,还提及将activity设置全屏隐藏导航栏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候,我们的页面隐藏了虚拟导航栏,然后在这个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);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值