エッジ ツー エッジ表示により、アプリはシステムバー(ステータスバー、キャプション バー、ナビゲーション バー)の背後に UI を描画して、没入感のあるユーザー エクスペリエンスを実現できます。Android 15(API レベル 35)以上を搭載しているデバイスをターゲットとする場合、デフォルトでエッジツーエッジが適用されます。
すべての Android バージョンでコンテンツをエッジ ツー エッジで正しく表示するには、次の設定手順に沿って操作します。これらの手順を行わないと、アプリがシステムバーの背後に単色を描画したり、コンテンツを画面キーボード(IME)の切り替えと同期してアニメーション表示したりしない可能性があります。
1. エッジ ツー エッジ表示を有効にする
以前の Android バージョンでエッジ ツー エッジを有効にするには、Activity.onCreate() メソッドで enableEdgeToEdge() を呼び出します。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
...
}
デフォルトでは、enableEdgeToEdge() はシステムバーを透明にします。ただし、3 ボタン ナビゲーション モードでは、ナビゲーション バーに半透明のスクリムを適用してコントラストを高めます。システム アイコンとスクリムの色は、システムのライトモードまたはダークモードに合わせて調整されます。
2. windowSoftInputMode を構成する
アクティビティの 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. インセットを使用してオーバーラップを処理する
エッジ ツー エッジを有効にすると、アプリのコンテンツと UI 要素の一部がシステムバーの背後に描画されることがあります。重要な要素やインタラクティブな要素がシステムバーで隠れたり、システム ジェスチャーと重なったりしないようにするには、インセットを処理する必要があります。
インセットは、システム UI またはシステム ジェスチャーと交差する画面の部分を表します。エッジ ツー エッジ表示で考慮すべき主なインセットの種類は次のとおりです。
- システムバー インセット: システムバーが表示される領域を表します。これらを使用して、システムバーによって UI が隠れないようにします。
- ディスプレイ カットアウト インセット: デバイスの画面に物理的なカットアウト(カメラ ノッチなど)が存在する領域を表します。
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 システムバーの設計ガイダンスとエッジ ツー エッジの設計ガイダンスを参照して判断してください。
3 ボタン ナビゲーション バーを半透明ではなく完全に透明にするには、コントラストの強制適用を無効にします。
window.isNavigationBarContrastEnforced = false
詳しくは、システムバーの保護についてをご覧ください。
ダイアログ
全画面表示のダイアログを端から端まで表示するには、ダイアログの onStart() メソッドで WindowCompat.enableEdgeToEdge を呼び出します。
class MyAlertDialogFragment : DialogFragment() {
override fun onStart(){
super.onStart()
dialog?.window?.let { WindowCompat.enableEdgeToEdge(it) }
}
...
}