有视频播放需求,切换横竖屏,一般都是从默认竖屏切换横屏。
除了设置全屏外
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);
}
}
网友评论