2012-06-14 15 views
10

当我在最近的手机和平板电脑上运行Android应用程序时,我正在设置“熄灯”模式。在我的onCreate()方法中,我添加了:在重新启动时维护“熄灯”模式(View.setSystemUiVisibility)

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显示时重新隐藏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调用,但这也没有什么不同。

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

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

回答

5

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

具体而言,在我的onResume路上,我有这样的代码:

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

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

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

由于公厕!

+0

+1,这个固定我的问题D: – Houssni

2

的Android 4.2在这里,三星平板电脑 - 您的解决方案并没有为我工作,我实际上设法与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(); 

}