在音量按下或最小化恢复之后,身临其境的模式导航变得粘滞

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { this.getWindow().getDecorView().setSystemUiVisibility(getSystemUiFlags()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private static int getSystemUiFlags() { return View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; } } 

第一次启动后

第一次启动后

按音量button后或最近的应用程序按两次

在这里输入图像描述

我看到QuickPic应用程序没有这个错误。 我不知道他们是如何省略它的。

至于我,我使用这个代码

 public void UiChangeListener() { final View decorView = getWindow().getDecorView(); decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { decorView.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); } } }); } 

并在onCreate上调用它。 🙂

我有同样的问题,我解决了一个简单的解决方法。 尽pipe我无法find这个解决方法的理论原因,但无论如何它对我都有效。

好像当按下音量button时,与“沉浸模式”相关的“标志”被清除。 我认为这就是为什么沉浸式模式被禁用,沉浸式模式不能自动恢复的原因。

因此,我尝试用'runnable'对象按下音量button后设置“标志”。

所以,它的工作原理是这样的:

沉浸式模式 – >按下音量button(清除标志) – > 500毫秒后,可运行对象再次设置标志 – >沉浸式模式恢复

1.首先定义可运行对象来设置标志

 private Runnable decor_view_settings = new Runnable() { public void run() { 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); } }; 

2.按下音量button时,将可运行对象拖延到处理程序

 private Handler mHandler = new Handler(); 

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { finish(); } else if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { mHandler.postDelayed(decor_view_settings, 500); } return super.onKeyDown(keyCode, event); } 

我没有理由就把它延迟了500毫秒,这并不重要。

3.具有可运行对象的沉浸式模式的基本代码

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(hasFocus) { mHandler.post(decor_view_settings); } } 

它完美地在我的应用程序。

所以,当我按下音量button时,沉浸式模式被禁用,音量摇杆popup。

几秒钟后,音量摇杆消失,状态栏和导航栏也消失。

希望为你工作。

我的解决scheme是在三个地方设置UI可见性标志:

  1. 当得到重点
  2. 在onResume
  3. 在OnSystemUiVisibilityChangeListener侦听器中

第三个解决了我的问题。 别人可能不需要,但我离开了他们。 这是什么样的:

  private void setupMainWindowDisplayMode() { View decorView = setSystemUiVisilityMode(); decorView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { setSystemUiVisilityMode(); // Needed to avoid exiting immersive_sticky when keyboard is displayed } }); } private View setSystemUiVisilityMode() { View decorView = getWindow().getDecorView(); int options; options = 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 // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; decorView.setSystemUiVisibility(options); return decorView; } 

setupMainWindowDisplayMode()在onCreate()中被调用。