在沉浸模式下隐藏系统栏
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
有些内容在全屏模式下会让用户获得最佳体验,而状态栏或导航栏上不显示任何指示器。例如视频、游戏、图片库、图书和演示文稿幻灯片。这称为沉浸模式。本页面介绍了如何采用全屏模式吸引用户更深入地了解相关内容。
图 1. 沉浸模式示例。
沉浸模式可帮助用户避免在游戏过程中意外退出,并提供沉浸式体验,让用户尽情欣赏图片、视频和图书。不过,您需要注意用户来回切换应用查看通知、进行临时搜索或执行其他操作的频率。由于沉浸模式会导致用户无法轻松访问系统导航,因此只有当用户体验的提升不仅仅是使用额外的屏幕空间时,才应使用沉浸模式。
使用 WindowInsetsControllerCompat.hide()
隐藏系统栏,并使用 WindowInsetsControllerCompat.show()
重新显示系统栏。
以下代码段展示了如何配置按钮以隐藏和显示系统栏。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
...
val windowInsetsController =
WindowCompat.getInsetsController(window, window.decorView)
// Configure the behavior of the hidden system bars.
windowInsetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// Add a listener to update the behavior of the toggle fullscreen button when
// the system bars are hidden or revealed.
ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { view, windowInsets ->
// You can hide the caption bar even when the other system bars are visible.
// To account for this, explicitly check the visibility of navigationBars()
// and statusBars() rather than checking the visibility of systemBars().
if (windowInsets.isVisible(WindowInsetsCompat.Type.navigationBars())
|| windowInsets.isVisible(WindowInsetsCompat.Type.statusBars())) {
binding.toggleFullscreenButton.setOnClickListener {
// Hide both the status bar and the navigation bar.
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
}
} else {
binding.toggleFullscreenButton.setOnClickListener {
// Show both the status bar and the navigation bar.
windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
}
}
ViewCompat.onApplyWindowInsets(view, windowInsets)
}
}
Java
@Override
protected void onCreate(Bundle savedInstanceState) {
...
WindowInsetsControllerCompat windowInsetsController =
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());
// Configure the behavior of the hidden system bars.
windowInsetsController.setSystemBarsBehavior(
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
);
// Add a listener to update the behavior of the toggle fullscreen button when
// the system bars are hidden or revealed.
ViewCompat.setOnApplyWindowInsetsListener(
getWindow().getDecorView(),
(view, windowInsets) -> {
// You can hide the caption bar even when the other system bars are visible.
// To account for this, explicitly check the visibility of navigationBars()
// and statusBars() rather than checking the visibility of systemBars().
if (windowInsets.isVisible(WindowInsetsCompat.Type.navigationBars())
|| windowInsets.isVisible(WindowInsetsCompat.Type.statusBars())) {
binding.toggleFullscreenButton.setOnClickListener(v -> {
// Hide both the status bar and the navigation bar.
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars());
});
} else {
binding.toggleFullscreenButton.setOnClickListener(v -> {
// Show both the status bar and the navigation bar.
windowInsetsController.show(WindowInsetsCompat.Type.systemBars());
});
}
return ViewCompat.onApplyWindowInsets(view, windowInsets);
});
}
您可以选择指定要隐藏的系统栏类型,并确定用户与这些系统栏互动时的行为。
指定要隐藏哪些系统栏
如需指定要隐藏的系统栏的类型,请将以下某个参数传递给 WindowInsetsControllerCompat.hide()
。
指定隐藏的系统栏的行为
使用 WindowInsetsControllerCompat.setSystemBarsBehavior()
指定当用户与隐藏的系统栏互动时,系统栏的行为方式。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-08-21。
[null,null,["最后更新时间 (UTC):2025-08-21。"],[],[],null,["# Hide system bars for immersive mode\n\nSome content is best experienced in fullscreen without any indicators on the\nstatus bar or the navigation bar. Some examples are videos, games, image\ngalleries, books, and presentation slides. This is referred to as\n*immersive mode*. This page shows how you can engage users more deeply with\ncontent in fullscreen. \n**Figure 1.** Example of immersive mode.\n\nImmersive mode helps users avoid accidental exits during a game and\ndelivers an immersive experience for enjoying images, videos, and books.\nHowever, be mindful of how often users jump in and out of apps to check notifications,\nto conduct impromptu searches, or to take other actions. Because immersive mode\ncauses users to lose easy access to system navigation, use immersive mode only\nwhen the benefit to the user experience goes beyond simply using extra screen\nspace.\n\nUse [`WindowInsetsControllerCompat.hide()`](/reference/androidx/core/view/WindowInsetsControllerCompat#hide(int))\nto hide the system bars and [`WindowInsetsControllerCompat.show()`](/reference/androidx/core/view/WindowInsetsControllerCompat#show(int))\nto bring them back.\n\nThe following snippet shows an example of configuring a button to hide and show\nthe system bars. \n\n### Kotlin\n\n```kotlin\noverride fun onCreate(savedInstanceState: Bundle?) {\n ...\n\n val windowInsetsController =\n WindowCompat.getInsetsController(window, window.decorView)\n // Configure the behavior of the hidden system bars.\n windowInsetsController.systemBarsBehavior =\n WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE\n\n // Add a listener to update the behavior of the toggle fullscreen button when\n // the system bars are hidden or revealed.\n ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { view, windowInsets -\u003e\n // You can hide the caption bar even when the other system bars are visible.\n // To account for this, explicitly check the visibility of navigationBars()\n // and statusBars() rather than checking the visibility of systemBars().\n if (windowInsets.isVisible(WindowInsetsCompat.Type.navigationBars())\n || windowInsets.isVisible(WindowInsetsCompat.Type.statusBars())) {\n binding.toggleFullscreenButton.setOnClickListener {\n // Hide both the status bar and the navigation bar.\n windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())\n }\n } else {\n binding.toggleFullscreenButton.setOnClickListener {\n // Show both the status bar and the navigation bar.\n windowInsetsController.show(WindowInsetsCompat.Type.systemBars())\n }\n }\n ViewCompat.onApplyWindowInsets(view, windowInsets)\n }\n}\n```\n\n### Java\n\n```java\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n ...\n\n WindowInsetsControllerCompat windowInsetsController =\n WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView());\n // Configure the behavior of the hidden system bars.\n windowInsetsController.setSystemBarsBehavior(\n WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE\n );\n\n // Add a listener to update the behavior of the toggle fullscreen button when\n // the system bars are hidden or revealed.\n ViewCompat.setOnApplyWindowInsetsListener(\n getWindow().getDecorView(),\n (view, windowInsets) -\u003e {\n // You can hide the caption bar even when the other system bars are visible.\n // To account for this, explicitly check the visibility of navigationBars()\n // and statusBars() rather than checking the visibility of systemBars().\n if (windowInsets.isVisible(WindowInsetsCompat.Type.navigationBars())\n || windowInsets.isVisible(WindowInsetsCompat.Type.statusBars())) {\n binding.toggleFullscreenButton.setOnClickListener(v -\u003e {\n // Hide both the status bar and the navigation bar.\n windowInsetsController.hide(WindowInsetsCompat.Type.systemBars());\n });\n } else {\n binding.toggleFullscreenButton.setOnClickListener(v -\u003e {\n // Show both the status bar and the navigation bar.\n windowInsetsController.show(WindowInsetsCompat.Type.systemBars());\n });\n }\n return ViewCompat.onApplyWindowInsets(view, windowInsets);\n });\n}\n```\n\nOptionally, you can specify the type of system bars to hide and determine\ntheir behavior when a user interacts with them.\n\n#### Specify which system bars to hide\n\nTo specify the type of system bars to hide, pass one of the following parameters\nto `WindowInsetsControllerCompat.hide()`.\n\n- Use [`WindowInsetsCompat.Type.systemBars()`](/reference/kotlin/androidx/core/view/WindowInsetsCompat.Type#systembars) to\n hide both system bars.\n\n- Use [`WindowInsetsCompat.Type.statusBars()`](/reference/kotlin/androidx/core/view/WindowInsetsCompat.Type#statusbars) to\n hide only the status bar.\n\n- Use [`WindowInsetsCompat.Type.navigationBars()`](/reference/kotlin/androidx/core/view/WindowInsetsCompat.Type#navigationbars) to\n hide only the navigation bar.\n\n#### Specify behavior of hidden system bars\n\nUse [`WindowInsetsControllerCompat.setSystemBarsBehavior()`](/reference/androidx/core/view/WindowInsetsControllerCompat#setSystemBarsBehavior(int))\nto specify how hidden system bars behave when the user interacts with them.\n\n- Use [`WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH`](/reference/androidx/core/view/WindowInsetsControllerCompat#BEHAVIOR_SHOW_BARS_BY_TOUCH())\n to reveal hidden system bars on *any* user interactions on the corresponding\n display.\n\n- Use [`WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE`](/reference/androidx/core/view/WindowInsetsControllerCompat#BEHAVIOR_SHOW_BARS_BY_SWIPE())\n to reveal hidden system bars on any system gestures, such as swiping from\n the edge of the screen where the bar is hidden from.\n\n- Use [`WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE`](/reference/androidx/core/view/WindowInsetsControllerCompat#BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE())\n to temporarily reveal hidden system bars with system gestures, such as\n swiping from the edge of the screen where the bar is hidden from. These\n transient system bars overlay your app's content, might have some degree of\n transparency, and are automatically hidden after a short timeout."]]