美文网首页
横竖屏切换隐藏显示虚拟导航栏

横竖屏切换隐藏显示虚拟导航栏

作者: 奥创没电了 | 来源:发表于2020-03-18 16:07 被阅读0次

    有视频播放需求,切换横竖屏,一般都是从默认竖屏切换横屏。
    除了设置全屏外

     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
     getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    

    虚拟导航栏也需要隐藏,问题就出在隐藏后回到竖屏页,恢复显示虚拟导航栏,但是有输入框时,一些机型上bug就找来了。根本原因就是显示隐藏的代码调存在漏洞。

    比如随便都能找到很多显示隐藏的,但在实际做了需求之后,同时也在同事老哥的帮助下,才得以解决这个问题。
    比如显示隐藏方法

    隐藏
     public static void hideNavigationBar(Window window, int defaultOptions) {
    if(window != null) {
        View decorView = window.getDecorView();
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB
                && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    
            decorView.setSystemUiVisibility(defaultOptions | View.GONE);
    
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    
            decorView.setSystemUiVisibility(defaultOptions
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        }
    }
    

    }

    显示
    public static void showNavigationBar(Window window, int defaultOptions) {
    if(window != null) {
        View decorView = window.getDecorView();
        decorView.setSystemUiVisibility(defaultOptions | 0
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
    }
    

    }

    其中这个defaultOptions 可以直接获取decorView.getSystemUiVisibility();

    如果只是简单这样调用,那屏幕切换过程就很容易发现问题了。
    核心就在于

    横屏全屏 切换回竖屏显示虚拟导航栏时,show方法里的defaultOptions参数,就一定要使用刚才切换横屏全屏时获取的值,就是这两个成对操作使用的同一个值

    比如完整调用横竖屏切换,横屏时获取decorView.getSystemUiVisibility(),竖屏时也使用这个值。

    int systemUiVisibility;
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            //竖屏
           showNavigationBar(window,systemUiVisibility );
        }else if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
            //横屏
          systemUiVisibility = decorView.getSystemUiVisibility()
            hideNavigationBar(window,systemUiVisibility);
        }
    }
    

    相关文章

      网友评论

          本文标题:横竖屏切换隐藏显示虚拟导航栏

          本文链接:https://www.haomeiwen.com/subject/xvfcyhtx.html