在音量按下或最小化恢复之后,身临其境的模式导航变得粘滞
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可见性标志:
- 当得到重点
- 在onResume
- 在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()中被调用。