当我的android应用程序在最近的手机和平板电脑上运行时,我正在为其设置“lights-out”模式。在我的onCreate()方法中,我添加了:

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

这比我想象的要好。在我的Android 3.2平板电脑上,状态栏以低调模式启动(栏上的所有按钮都替换为圆点)。如果我与工具栏上的按钮进行交互,它将变为正常,然后再返回低调模式(例如,如果我从状态栏中检查配置/通知窗口)。因此,这似乎是我的应用程序的一个属性,而不是直接隐藏UI的“命令”。

但是,有两个未处理的特殊情况。首先,如果用户点击状态栏而未击中任何点,则该栏变为 Activity 状态。除非用户实际与栏上的内容进行交互(例如查看通知或截屏),否则它永远不会回到低调模式。因此,如果他们返回与我的应用程序进行交互,则状态栏将不再处于低调模式。 (Gallery应用程序似乎也存在此问题,所以也许不仅仅是我。)第二个极端情况是锁定屏幕上的简历。如果我点击电源按钮以锁定平板电脑,然后将其解锁并继续运行应用程序,则状态栏将完全可见(并且与之交互不会改变任何内容)。 (“图库”应用程序没有此问题。)

几篇博客文章建议我可以设置一个处理程序以监听系统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调用。

但是,使用这些回调不会对UI产生明显影响。我可以看到从某些日志消息中正在调用正确的处理程序,并且可以看到正在调用监听器。

我还尝试在onResume路径中调用STATUS_BAR_HIDDEN调用,但这也没有任何区别。

我正在寻找有关这是某种已知错误的信息,或有关Gallery应用程序可能正在做的工作的提示(假定其做事有所不同)。或建议其他API尝试使用(或可能相关的其他详细信息)。

我正在使用libGDX,而且我的应用程序只有一个 View ,因此非常简单。该 View 还被设置为全屏显示,libGDX没有标题。我的 list 中将targetSdkVersion设置为15。

最佳答案

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

具体来说,在我的onResume路径中,我的代码是这样的:

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

使状态栏可见的看似不必要的调用,似乎使解锁设备后的随后的使状态栏隐藏的调用实际上可以正常工作。

10-06 08:57
查看更多