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

时间:2012-06-14 05:33:51

标签: android

当我的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不可见。稍后,如果我的应用程序中有任何触摸事件(它们由相同的game对象处理),并且此标志已设置,则我再次调用STATUS_BAR_HIDDEN调用。

然而,使用这些回调,对UI没有可见的影响。我可以看到正在从一些日志消息中调用正确的处理程序,我可以看到正在调用侦听器。

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

我正在寻找有关这是某种已知错误的信息,或提示Gallery应用可能正在做什么(假设它采取不同的做法)。或建议其他API尝试(或其他可能相关的细节)。

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

Android 4.2在这里,在三星平板电脑上 - 你的解决方案对我不起作用,我实际上设法通过onSystemUiVisibilityChange在onAnimationEnd监听器之后用ValuAnimator触发了

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

}

答案 2 :(得分:1)

这解决了我的问题:

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。!