2011-10-07 110 views
17

我需要一些帮助来切换全屏模式。我在首选项屏幕中设置了全屏。在我的主要活动的我的onResume有:切换全屏模式

if(mFullscreen == true) { 
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
       getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 

      } else 
      { 
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
       getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 

      } 

但是,这似乎并没有工作,因为它需要setContentView权之前叫什么名字?

......而且,我有requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView前,它带走的标题和状态栏...任何人能提供一些帮助?

---编辑--- 好吧,我有一个错误,导致这不起作用。所以它确实如此。现在,我只需要知道如何切换标题栏。

回答

22
private void setFullscreen(boolean fullscreen) 
{ 
    WindowManager.LayoutParams attrs = getWindow().getAttributes(); 
    if (fullscreen) 
    { 
     attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; 
    } 
    else 
    { 
     attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; 
    } 
    getWindow().setAttributes(attrs); 
} 
3

我的解决方案结合了答案:

我添加了这些方法来我的活动。要切换全屏,请使用setFullScreen(!isFullScreen())

public boolean isFullScreen() { 

    return (getWindow().getAttributes().flags & 
     WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; 
} 

@SuppressLint("NewApi") 
public void setFullScreen(boolean full) { 

    if (full == isFullScreen()) { 
     return; 
    } 

    Window window = getWindow(); 
    if (full) { 
     window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    } else { 
     window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    } 

    if (Build.VERSION.SDK_INT >= 11) { 
     if (full) { 
      getActionBar().hide(); 
     } else { 
      getActionBar().show(); 
     } 
    } 
} 

就我而言,我希望有一个菜单按钮做切换。问题是:在没有硬件菜单按钮的设备上,隐藏操作栏也隐藏了从全屏返回的切换。所以,我添加了一些额外的逻辑,所以如果设备具有硬件菜单按钮,它只隐藏操作栏。请注意,运行SDK 11-13的设备没有一个。

if (Build.VERSION.SDK_INT >= 14 
     && ViewConfiguration.get(this).hasPermanentMenuKey()))) { 

     if (full) { 
      getActionBar().hide(); 
     } else { 
      getActionBar().show(); 
     } 
    } 

老设备(运行姜饼或更早版本)有一个标题栏,而不是一个操作栏。以下代码将隐藏它,但请注意,一旦活动开始,标题栏就不能显示/隐藏。我在帮助菜单中向用户提供了一条消息,指出全屏更改可能不会在旧设备上完全生效,直到他们重新启动应用程序/活动(当然这假设您只有在需要时才继续选择并执行此代码全屏)。

// call before setContentView() 
    if (Build.VERSION.SDK_INT < 11) { 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
    } 
6

由于Jellybean(4.1)有一个不依赖于WindowManager的新方法。相反,使用setSystemUiVisibility关闭窗口,这比使用WindowManager标志可以更精确地控制系统栏。这是你如何启用全屏:

if (Build.VERSION.SDK_INT < 16) { //ye olde method 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN); 
} else { // Jellybean and up, new hotness 
    View decorView = getWindow().getDecorView(); 
    // Hide the status bar. 
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; 
    decorView.setSystemUiVisibility(uiOptions); 
    // Remember that you should never show the action bar if the 
    // status bar is hidden, so hide that too if necessary. 
    ActionBar actionBar = getActionBar(); 
    actionBar.hide(); 
} 

这就是你如何恢复上面的代码:

if (Build.VERSION.SDK_INT < 16) { //ye olde method 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
} else { // Jellybean and up, new hotness 
    View decorView = getWindow().getDecorView(); 
    // Hide the status bar. 
    int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE; 
    decorView.setSystemUiVisibility(uiOptions); 
    // Remember that you should never show the action bar if the 
    // status bar is hidden, so hide that too if necessary. 
    ActionBar actionBar = getActionBar(); 
    actionBar.show(); 
} 
+0

请注意,您可能需要调用'getSupportActionBar()'来代替。 – JakeSteam

+0

我用这个方法,在华为机器状态栏有隐藏但是视图不能自动调整位置到屏幕顶部 – Carl

3

有一个较短的切换全屏方法实现:

private void toggleFullscreen() { 
    WindowManager.LayoutParams attrs = getWindow().getAttributes(); 
    attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN; 
    getWindow().setAttributes(attrs); 
} 

它采用逐位异或逻辑切换FLAG_FULLSCREEN

8
/** 
* toggles fullscreen mode 
* <br/> 
* REQUIRE: android:configChanges="orientation|screenSize" 
* <pre> 
* sample: 
*  private boolean fullscreen; 
*  ................ 
*  Activity activity = (Activity)context; 
*  toggleFullscreen(activity, !fullscreen); 
*  fullscreen = !fullscreen; 
* </pre> 
*/ 
private void toggleFullscreen(Activity activity, boolean fullscreen) { 
    if (Build.VERSION.SDK_INT >= 11) { 
     // The UI options currently enabled are represented by a bitfield. 
     // getSystemUiVisibility() gives us that bitfield. 
     int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility(); 
     int newUiOptions = uiOptions; 
     boolean isImmersiveModeEnabled = 
       ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions); 
     if (isImmersiveModeEnabled) { 
      Log.i(context.getPackageName(), "Turning immersive mode mode off. "); 
     } else { 
      Log.i(context.getPackageName(), "Turning immersive mode mode on."); 
     } 

     // Navigation bar hiding: Backwards compatible to ICS. 
     if (Build.VERSION.SDK_INT >= 14) { 
      newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
     } 

     // Status bar hiding: Backwards compatible to Jellybean 
     if (Build.VERSION.SDK_INT >= 16) { 
      newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN; 
     } 

     // Immersive mode: Backward compatible to KitKat. 
     // Note that this flag doesn't do anything by itself, it only augments the behavior 
     // of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample 
     // all three flags are being toggled together. 
     // Note that there are two immersive mode UI flags, one of which is referred to as "sticky". 
     // Sticky immersive mode differs in that it makes the navigation and status bars 
     // semi-transparent, and the UI flag does not get cleared when the user interacts with 
     // the screen. 
     if (Build.VERSION.SDK_INT >= 18) { 
      newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
     } 
     activity.getWindow().getDecorView().setSystemUiVisibility(newUiOptions); 
    } else { 
     // for android pre 11 
     WindowManager.LayoutParams attrs = activity.getWindow().getAttributes(); 
     if (fullscreen) { 
      attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; 
     } else { 
      attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; 
     } 
     activity.getWindow().setAttributes(attrs); 
    } 

    try { 
     // hide actionbar 
     if (activity instanceof ActionBarActivity) { 
      if (fullscreen) ((ActionBarActivity) activity).getSupportActionBar().hide(); 
      else ((ActionBarActivity) activity).getSupportActionBar().show(); 
     } else if (Build.VERSION.SDK_INT >= 11) { 
      if (fullscreen) activity.getActionBar().hide(); 
      else activity.getActionBar().show(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // set landscape 
    // if(fullscreen) activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
    // else activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
} 

我的代码在Android 2.3和4.4下正常工作。2

+2

伟大的最新更新方法!两件事情:1)newUiOptions修改缺少非全屏“&=〜xxx”部分,2)最新的appcompat lib使用AppCompatActivity而不是ActionBarActivity。 –

+0

非常感谢为我工作 – Richi