安卓:显示/隐藏状态栏/电源栏

64
我想创建一个按钮,能够在我的平板电脑上隐藏或显示状态栏。我已经放置了在onCreate中。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

并且在按钮中显示:

WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);

隐藏:

WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
任何提示/技巧吗?
//编辑
我看了这个提示:http://android.serverbox.ch/?p=306 并像这样更改了我的代码:
private void hideStatusBar() throws IOException, InterruptedException {
    Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 79 s16 com.android.systemui"});
    proc.waitFor();
}

private void showStatusBar() throws IOException, InterruptedException {
    Process proc = Runtime.getRuntime().exec(new String[]{"am","startservice","-n","com.android.systemui/.SystemUIService"});
    proc.waitFor();
}

如果我点击按钮并调用方法,我可以看到应用程序正在等待一些秒钟,所以我知道发生了一些事情。 我还查看了 LockCat 并看到有一些进展。

显示: http://pastebin.com/CidTRSTi 隐藏: http://pastebin.com/iPS6Kgbp

11个回答

158

您在清单文件中设置了全屏主题吗?

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
我认为如果没有此设置,您将无法全屏。我会使用以下代码来添加和删除全屏标志:
// Hide status bar
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
// Show status bar
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

1
不,我还没有将它添加到清单中。但是当我尝试添加时,我会收到以下错误提示:错误:找不到与给定名称匹配的资源(在“主题”处的值为“@android:style/Theme.Dark.NoTitleBar.Fullscreen”)。 - B770
1
@B770: 没有名为Theme.Dark.NoTitleBar.Fullscreen的主题。但是,有一个名为Theme.NoTitleBar.Fullscreen的主题。然而,在Android 3.0+设备上缺少屏幕外HOME和BACK按钮的情况下,您无法摆脱系统栏。 - CommonsWare
@CommonWare:我找到了这个链接: http://forum.xda-developers.com/showthread.php?t=1265397 这里可以隐藏和显示状态栏。我已经安装了包含此功能的“Overcome” ROM,并且它可以使用。因此,我认为也可以将此功能放在其他按钮上... - B770
好的,我明白了。我忘记给应用程序授予su权限。现在一切都正常工作 :) - B770
当向上或向下滚动时,是否可以显示/隐藏状态栏? - Zahra.HY
@Rob,这个工作得很好,但我遇到了一个问题,当我执行添加和清除操作时,状态栏会在几毫秒内显示白色,看起来非常奇怪。有什么解决办法吗? - Nouman Ch

38

对于有些人来说,通过清除FLAG_FULLSCREEN来显示状态栏可能无效。

以下是适用于我的解决方案,(文档) (标志参考)

隐藏状态栏

// Hide Status Bar
if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
else {
   View decorView = getWindow().getDecorView();
  // Hide Status Bar.
   int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
   decorView.setSystemUiVisibility(uiOptions);
}

显示状态栏

   if (Build.VERSION.SDK_INT < 16) {
              getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    else {
       View decorView = getWindow().getDecorView();
      // Show Status Bar.
       int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
       decorView.setSystemUiVisibility(uiOptions);
    }

3
我有完全相同的代码,但状态栏仍在显示。 - Sanjeev

5

用于Android中的Kotlin语言 在Kotlin中隐藏状态栏时不需要在行末使用分号(;)

window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)

在安卓系统中,使用Java语言可以隐藏状态栏。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

它只隐藏了状态栏,没有显示。 - CoolMind

4

我知道这是一个非常老的问题,但如果有人在寻找最新支持的通过编程方式隐藏状态栏的方法,请按如下方式执行:

window.insetsController?.hide(WindowInsets.Type.statusBars())

并再次显示它:

window.insetsController?.show(WindowInsets.Type.statusBars())

1
我认为应该添加有关在minSdk < 30上使用此方法的信息:ViewCompat.getWindowInsetsController(window.decorView)?.hide(WindowInsetsCompat.Type.systemBars()) - Nail Shaykhraziev

2

我尝试了很多方法。

最终,这是最适合隐藏和显示全屏模式的代码。

private fun hideSystemUi() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.setDecorFitsSystemWindows(true)
    } else {
        // hide status bar
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.decorView.systemUiVisibility =
            View.SYSTEM_UI_FLAG_IMMERSIVE or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    }

}

private fun showSystemUi() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.setDecorFitsSystemWindows(false)
    } else {
        // Show status bar
        window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_STABLE
    }

}

这个应用程序已经实现了这个功能:Android Breakdown

前往视频(底部栏)> 播放任何视频 > 切换全屏


1
对于Kotlin用户
显示如下: 要展示

activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)

隐藏

activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)


1
 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //hide status bar
    requestWindowFeature( Window.FEATURE_NO_TITLE );
    getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN );


    setContentView(R.layout.activity_main);
}

1
使用这种方法,通过SYSTEM_UI_FLAG_IMMERSIVE_STICKY标志,只需一次轻触即可全屏返回,无需任何实现。只需复制下面的方法并在您的活动中调用它即可。 更多细节在这里
private void hideSystemUI() {
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_IMMERSIVE
                    // Set the content to appear under the system bars so that the
                    // content doesn't resize when the system bars hide and show.
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    // Hide the nav bar and status bar
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN);
}

0

参考 - https://developer.android.com/training/system-ui/immersive.html

// This snippet shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() {
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

0
fun Activity.setStatusBarVisibility(isVisible: Boolean) {
    //see details https://developer.android.com/training/system-ui/immersive
    if (isVisible) {
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    } else {
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_FULLSCREEN)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接