Android 维持;熄灯“;跨重启的模式(View.SetSystemMivibility)

Android 维持;熄灯“;跨重启的模式(View.SetSystemMivibility),android,Android,我正在为我的android应用程序设置“熄灯”模式,当它在最近的手机和平板电脑上运行时。在我的onCreate()方法中,我添加了: View rootView = getWindow().getDecorView(); rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); // aka View.SYSTEM_UI_FLAG_LOW_PROFILE 这比我想象的要好。在我的Android 3.2平板电脑上,状态栏以低调模式启动(状态栏

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

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

不过,有两个角落的案例没有得到处理。首先,如果用户点击状态栏而未点击任何点,则状态栏变为活动状态。它永远不会回到低调模式,直到用户真正与酒吧上的东西进行交互(例如,查看通知或截图)。因此,如果他们回到与我的应用程序交互,状态栏将不再处于低调模式。(Gallery应用程序似乎也有这个问题,所以可能不仅仅是我。)第二个角落的案例是锁屏上的简历。如果我点击电源按钮锁定平板电脑,然后解锁并恢复应用程序,状态栏将完全可见(与之交互不会改变任何东西)。(Gallery应用程序没有此问题。)

一些博客文章建议我可以设置一个处理程序来监听系统UI可见性的变化,然后在UI可见时重新隐藏它。像这样:

rootView.setOnSystemUiVisibilityChangeListener(
  new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
      if (visibility == View.STATUS_BAR_VISIBLE) {
        game.flagUIIsVisible();
      }
    }
  });
在我的例子中,
game
对象上的方法只是设置了一个标志,表示UI不可见。稍后,如果我的应用程序中有任何触摸事件(它们由相同的
游戏
对象处理),并且设置了此标志,那么我将再次调用STATUS\u BAR\u HIDDEN调用

但是,使用这些回调对UI没有明显的影响。我可以看到正在从一些日志消息调用正确的处理程序,并且可以看到正在调用侦听器

我还尝试在我的
onResume
路径中调用STATUS\u BAR\u HIDDEN调用,但这也没有什么不同

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


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

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

具体来说,在我的
onResume
路径中,我有如下代码:

View rootView = getWindow().getDecorView();
rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE);
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
看似不必要的使状态栏可见的调用,似乎使随后的使状态栏隐藏的调用在解锁设备后实际工作。

这解决了我的问题:

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);
        }
    }
});

谢谢,p.T

三星平板电脑上的安卓4.2——您的解决方案对我不起作用,我实际上是在OnSystemActivityChange之后解雇了ValueAnimator,并使用onAnimationEnd listener实现了这一点

        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();

}