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

2020-03-18  本文已影响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);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读