如何在我的 Android 11 应用程序中隐藏状态栏?

How do I hide the status bar in my Android 11 app?

我遇到的隐藏我的 Android 应用程序状态栏的所有方法在 Android 11 中已弃用。

有人知道目前可接受的方法吗?

我也使用 Kotlin 开发我的应用程序。

API 等级 < 16

如果您想在应用程序中隐藏 status bar,只需将应用程序设置为全屏即可。在 onCreate 方法中只需添加 FLAG_FULLSCREEN

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_loading);

这是如果Build.VERSION.SDK_INT < 16.

API 等级 >= 16 且 < 30

这适用于 Build.VERSION.SDK_INT 大于 16;

    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);

只需将其添加到 onCreate 中您想隐藏 status bar 的位置。您可以在此处阅读更多内容:https://developer.android.com/training/system-ui/status#41


编辑:API 级别 >= 30

似乎 SYSTEM_UI_FLAG_FULLSCREEN 也从 Android 11 中删除,即使它在文档中没有说明任何内容。但是基于 this tutorial you can do this in Android 11 you need to use WindowInsetsController and its hide() 方法。与建议的其他答案一样,您可以使用:

getWindow().getDecorView().getWindowInsetsController().hide(
        android.view.WindowInsets.Type.statusBars()
    );

因此,这是针对Android11及更高版本的,其他方法适用于更早的版本。

当您的设备为 API-30 (Android 11; minSdkVersion 30) 或更高版本时,setSystemUiVisibility 已弃用,您可以使用新引入的 WindowInsetsController 代替. (请注意,您不能在 API-29 或更早版本上使用 WindowInsetsController)。

所以官方参考说:

This method was deprecated in API level 30. SystemUiVisibility flags are deprecated. Use WindowInsetsController instead.

你应该使用 WindowInsetsController class.

在 Kotlin 中:

window.decorView.windowInsetsController!!.hide(
    android.view.WindowInsets.Type.statusBars()
)

在Java中:

getWindow().getDecorView().getWindowInsetsController().hide(
    android.view.WindowInsets.Type.statusBars()
);

如果你也想隐藏NavigationBar:

在 Kotlin 中:

window.decorView.windowInsetsController!!.hide(
    android.view.WindowInsets.Type.statusBars()
            or android.view.WindowInsets.Type.navigationBars()
)

在Java中:

getWindow().getDecorView().getWindowInsetsController().hide(
    android.view.WindowInsets.Type.statusBars()
            | android.view.WindowInsets.Type.navigationBars()
);

你在找这个吗?

// Enables regular immersive mode.
// For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
window.decorView.systemUiVisibility = (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.
        or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        // Hide the nav bar and status bar
        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        or View.SYSTEM_UI_FLAG_FULLSCREEN)

Enable fullscreen mode Hide the status bar

这是在 kotlin 中 hide/show 状态栏的最简单方法。

private fun Activity.hideStatusBars() {
    WindowInsetsControllerCompat(window, window.decorView)
        .hide(WindowInsetsCompat.Type.statusBars())
}

private fun Activity.showStatusBars() {
    WindowInsetsControllerCompat(window, window.decorView)
        .hide(WindowInsetsCompat.Type.statusBars())
}

如果您需要 show/hide 状态栏和导航栏都使用 systemBars() 而不是 statusBars(),如下例所示。

private fun Activity.hideSystemBars() {
    WindowInsetsControllerCompat(window, window.decorView)
        .hide(WindowInsetsCompat.Type.systemBars())
}

private fun Activity.showSystemBars() {
    WindowInsetsControllerCompat(window, window.decorView)
        .hide(WindowInsetsCompat.Type.systemBars())
}