设置全屏显示

无边框显示功能可让应用在系统栏(状态栏、标题栏和导航栏)后方绘制界面,从而实现更具沉浸感的用户体验。如果您的目标设备搭载的是 Android 15(API 级别 35)或更高版本, 则默认会强制使用无边框显示

如需在所有 Android 版本上正确显示无边框内容,请按照以下设置步骤操作。如果不执行这些步骤,您的应用可能会在系统栏后方绘制纯色,或者不会与屏幕键盘 (IME) 过渡同步地为内容添加动画效果。

1. 启用无边框显示

如需在之前的 Android 版本上启用无边框显示,请在 enableEdgeToEdge()方法中调用Activity.onCreate()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    enableEdgeToEdge()
    ...
}

默认情况下,enableEdgeToEdge() 会使系统栏透明,但在三按钮导航模式下,它会在导航栏上应用半透明的遮罩层,以提高对比度。系统图标和遮罩层的颜色会适应系统的浅色或深色主题。

2. 配置 windowSoftInputMode

在 activity 的 AndroidManifest.xml 条目中设置 android:windowSoftInputMode="adjustResize"。启用此设置后,您的应用能够接收 IME 边衬区,从而在屏幕键盘显示或消失时,您可以使用内边距调整布局。

<!-- In your AndroidManifest.xml file: -->
<activity
  android:name=".ui.MainActivity"
  android:label="@string/app_name"
  android:windowSoftInputMode="adjustResize"
  android:theme="@style/Theme.MyApplication"
  android:exported="true">
  ...
</activity>

3. 使用边衬区处理重叠

启用无边框显示后,应用的部分内容和界面元素可能会绘制在系统栏后方。为防止关键元素或互动元素被系统栏遮挡或与系统手势重叠,您需要处理边衬区。

边衬区描述了与系统界面或系统手势相交的屏幕部分。对于无边框显示,需要考虑的主要边衬区类型包括:

  • 系统栏边衬区 :表示显示系统栏的区域。使用这些边衬区可避免界面被系统栏遮挡。
  • 刘海屏边衬区 :表示设备屏幕上存在物理刘海(如摄像头凹口)的区域。

在 Compose 中,您可以使用标尺、内边距修饰符或边衬区大小修饰符来处理边衬区。如需了解详细指南,请参阅关于窗口边衬区

高级主题

对于更高级的无边框用例,请考虑以下事项。

沉浸模式

某些内容(如视频或地图)受益于完全沉浸式体验,即系统栏处于隐藏状态。您可以使用 WindowInsetsControllerCompat 隐藏系统栏:

val windowInsetsController =
    WindowCompat.getInsetsController(window, window.decorView)

// Hide the system bars.
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())

// Show the system bars.
windowInsetsController.show(WindowInsetsCompat.Type.systemBars()) For example, use either `Scaffold`,

系统栏颜色和图标

在无边框显示模式下,应用的背景可能会显示在系统栏后方,因此您可能需要调整系统栏图标颜色以提高对比度。

如需将状态栏图标更改为浅色或深色,请使用 WindowInsetsControllerCompat

// Set status bar icons to dark
WindowCompat.getInsetsController(window, window.decorView)
    .isAppearanceLightStatusBars = true

// Set status bar icons to light
WindowCompat.getInsetsController(window, window.decorView)
    .isAppearanceLightStatusBars = false

系统栏保护

虽然 enableEdgeToEdge() 提供默认的透明或半透明系统栏,但您可能需要自定义此设置。请参阅 Android 系统栏设计 指南无边框设计指南,以确定何时使用 透明栏与半透明栏。

如需使三按钮导航栏完全透明而不是半透明,您可以停用对比度强制执行:

window.isNavigationBarContrastEnforced = false

如需了解详情,请参阅关于系统栏保护

对话框

如需以无边框显示全屏对话框,请在对话框的 onStart() 方法中调用 WindowCompat.enableEdgeToEdge

class MyAlertDialogFragment : DialogFragment() {
    override fun onStart(){
        super.onStart()
        dialog?.window?.let { WindowCompat.enableEdgeToEdge(it) }
    }
    ...
}