溢出菜单单击禁用Immersive模式 – Android 4.4 Kitkat

有人知道这是一个错误还是应该这样做。 当使用KitKat的Immersive模式时点击Overflow图标,它禁用沉浸模式。 其他人遇到这个?

完整的代码由谷歌 – 在这里

public void toggleHideyBar() { // The UI options currently enabled are represented by a bitfield. // getSystemUiVisibility() gives us that bitfield. int uiOptions = getActivity().getWindow().getDecorView().getSystemUiVisibility(); int newUiOptions = uiOptions; boolean isImmersiveModeEnabled = ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions); if (isImmersiveModeEnabled) { Log.i(TAG, "Turning immersive mode mode off. "); } else { Log.i(TAG, "Turning immersive mode mode on."); } // Navigation bar hiding: Backwards compatible to ICS. if (Build.VERSION.SDK_INT >= 14) { newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } // Status bar hiding: Backwards compatible to Jellybean if (Build.VERSION.SDK_INT >= 16) { newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN; } // Immersive mode: Backward compatible to KitKat. // Note that this flag doesn't do anything by itself, it only augments the behavior // of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample // all three flags are being toggled together. // Note that there are two immersive mode UI flags, one of which is referred to as "sticky". // Sticky immersive mode differs in that it makes the navigation and status bars // semi-transparent, and the UI flag does not get cleared when the user interacts with // the screen. if (Build.VERSION.SDK_INT >= 18) { newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } getActivity().getWindow().getDecorView().setSystemUiVisibility(newUiOptions); } 

在K中,溢出菜单是一个单独的窗口,需要关注,因此驱动当前的系统UI标志。

但是,只有在状态栏被隐藏时才试图显示操作栏才​​会出现,这是不鼓励的 。 对于操作栏之外的上下文菜单,您可以使用PopupWindow来代替(使用PopupWindow您可以根据需要PopupWindow设置系统UI标志)。

我不清楚如何设置PopupWindow的系统UI标志。 我尝试了这样的事情:

 PopupMenu popupMenu = new PopupMenu(mainHandle, view) { @Override public void show() { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); super.show(); } 

这是Kotlin中的一种解决方法,当ActionBarpopup菜单被解除时,可以使沉浸式模式恢复:

 override fun onCreate(savedInstanceState: Bundle?) { ... supportActionBar!!.addOnMenuVisibilityListener { isVisible -> if (!isVisible) enableImmersiveMode() } ... } @SuppressLint("InlinedApi") private fun enableImmersiveMode() { window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION }