有視頻播放需求,切換橫豎屏,一般都是從默認豎屏切換橫屏。
除了設置全屏外
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();
如果只是簡單這樣調用,那屏幕切換過程就很容易發(fā)現問題了。
核心就在于
橫屏全屏 切換回豎屏顯示虛擬導航欄時,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);
}
}