新项目推出了有虚拟按键的机型。在某些界面上需要隐藏虚拟按键
有几种
1.Activity里面,在setContentView()方法之前使用一下方法可以达到隐去虚拟按键
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
2.在Dialog里面,在show()方法之前执行下面的方法也可以达到目的
private void hideVirtualKey(){ mDialog.getWindow().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; } else { uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE; } mDialog.getWindow().getDecorView().setSystemUiVisibility(uiOptions); } }); }
但是在我的机型里面有一个问题,那就是我的设置了
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION和View.SYSTEM_UI_FLAG_HIDE_NAVIGATION这两个属性,会在全屏下弹出“正在全屏模式下查看”确认对话框,
后面查了才知道在PhoneWindowManager.java里面有对window的flag进行判断是否是沉浸模式
private boolean isImmersiveMode(int vis) { final int flags = View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; return mNavigationBar != null && (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 && (vis & flags) != 0 && canHideNavigationBar(); }
如果是的话就有可能会触发沉浸模式
我是不要进入沉浸模式的,再往下查,可以看到除了这个判断之外,其实在if里还加了一个属性的判断
boolean oldImmersiveMode = isImmersiveMode(oldVis); boolean newImmersiveMode = isImmersiveMode(vis); Log.i(TAG,"lsn oldVis = "+oldVis+" vis = "+vis); if (win != null && oldImmersiveMode != newImmersiveMode /// M: When gesture disabled, don't show the immersive mode user guide && (win.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED) == 0) { final String pkg = win.getOwningPackage(); mImmersiveModeConfirmation.immersiveModeChangedLw(pkg, newImmersiveMode, isUserSetupComplete()); }
如果没有这个属性最终才会进入沉浸模式
View.SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED
所以我在的代码里面或上了这个属性就OK了
private void hideVirtualKey(){ mDialog.getWindow().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 // begin |View.SYSTEM_UI_FLAG_IMMERSIVE_GESTURE_ISOLATED ; // end if (Build.VERSION.SDK_INT >= 19) { uiOptions |= 0x00001000; } else { uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE; } mDialog.getWindow().getDecorView().setSystemUiVisibility(uiOptions); } }); }