在重新启动时保持“熄灯”模式(View.setSystemUiVisibility)

当我的Android应用在最近的手机和平板电脑上运行时,我正在设置“熄灯”模式。 在我的onCreate()方法中,我添加了:

View rootView = getWindow().getDecorView(); rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); // aka View.SYSTEM_UI_FLAG_LOW_PROFILE 

这比我想象的更好。 在我的Android 3.2平板电脑上,状态栏以低调模式启动(条上的所有button都被点replace)。 如果我与栏上的button进行交互,这将是正常的,然后回到低调模式(例如,如果我从状态栏检查configuration/通知窗口)。 所以这似乎是更多的应用程序的属性,而不是一个“命令”直接隐藏用户界面。

有两个angular落的情况下,不处理,但。 首先,如果用户点击状态栏而不点击任何点,则该栏变为活动状态。 它永远不会回到低调模式,直到用户实际上与栏上的东西交互(例如,看通知或截图)。 所以,如果他们回到与我的应用程序交互,状态栏不再处于低调模式。 (画廊应用程序似乎也有这个问题,所以也许它不只是我。)第二个angular落的情况是从locking屏幕的简历。 如果我点击电源buttonlocking平板电脑,然后解锁它,并恢复应用程序,状态栏是完全可见的(和它交互不会改变任何东西)。 (图库应用程序没有这个问题。)

一对夫妇的博客文章表明,我可以设置一个处理程序来监听系统UI可见性的变化,然后重新隐藏UI,如果它变得可见。 喜欢这个:

 rootView.setOnSystemUiVisibilityChangeListener( new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if (visibility == View.STATUS_BAR_VISIBLE) { game.flagUIIsVisible(); } } }); 

在我的情况下, game对象上的方法只是设置一个标志,说UI不可见。 后来,如果我的应用程序中有任何触摸事件(它们由相同的game对象处理),并且设置了该标志,那么我再次调用STATUS_BAR_HIDDEN调用。

但是,通过这些callback,UI不会有可见的影响。 我可以看到正确的处理程序正在从一些日志消息被调用,我可以看到侦听器正在被调用。

我也试过在我的onResumepath中调用STATUS_BAR_HIDDEN调用,但是这也没有什么不同。

我正在寻找信息,这是一些已知的错误,或提示画廊应用程序可能在做什么(假设它做不同的事情)。 或者尝试其他API的build议(或其他可能相关的细节)。

我使用libGDX,我的应用程序只有一个视图,所以它非常简单。 该视图也设置为全屏,没有标题libGDX。 我的清单中我的targetSdkVersion设置为15。

Solutions Collecting From Web of "在重新启动时保持“熄灯”模式(View.setSystemUiVisibility)"

我怀疑在Android 3.2中有一个错误,因为我可以通过在onResume禁用状态栏之前重新启用状态栏来解决从locking屏幕恢复问题。 不需要OnSystemUiVisibilityChangeListener

具体来说,在我的onResumepath我有这样的代码:

 View rootView = getWindow().getDecorView(); rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); 

似乎不必要的调用使状态栏可见,似乎使解锁后的状态栏隐藏实际上工作的后续调用。

Android 4.2在这里,在三星平板电脑 – 你的解决scheme并没有为我工作,我实际上设法做到这一点与ValuAnimator在onSystemUiVisibilityChange之后,与onAnimationEnd监听器

  topView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { hideMenu(); } }); private void hideMenu(){ ValueAnimator hideAnim = ValueAnimator.ofInt(1,2); hideAnim.setDuration(1); hideAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { topView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); } }); hideAnim.start(); } 

这解决了我的问题:

 rootView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) { rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); } } }); 

感谢PT!