狭額縁ディスプレイを手動でセットアップする

アプリでエッジ ツー エッジ ディスプレイを有効にするには、enableEdgeToEdge を呼び出します。ほとんどのアプリではこれで十分です。このガイドでは、アプリで enableEdgeToEdge を使用せずにエッジツーエッジを有効にする必要がある場合に、エッジツーエッジを有効にする方法について説明します。

アプリを全画面表示でレイアウトする

システムバーの背後にアプリを配置するには、次のコード例のように WindowCompat.setDecorFitsSystemWindows(window, false) を使用します。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  WindowCompat.setDecorFitsSystemWindows(window, false)
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
}

システムバーの色を変更する

エッジ ツー エッジのレイアウトで実行する場合、アプリはシステムバーの色を変更して、その下のコンテンツを表示できるようにする必要があります。アプリがこのステップを実施すると、ジェスチャー ナビゲーション モードとボタンモードで、ユーザー インターフェースのすべての視覚的保護がシステムによって処理されます。

  • ジェスチャー ナビゲーション モード: システムバーのコンテンツの色が、システムバーの背後にあるコンテンツに応じて変化する、動的な色調整が適用されます。次の例では、ナビゲーション バーのハンドルが、明るいコンテンツの上にあるときは濃い色に、暗い色のコンテンツの上にあるときは明るい色に変わっています。
図 1.ジェスチャー ナビゲーション モードでの色の変更。
  • ボタンモード: システムバー(API レベル 29 以降の場合)または透明なシステムバー(API レベル 28 以前)の背後に半透明のスクリムを適用します。
半透明のシステムバーを示す画像
図 2.システムバーの後ろにある半透明のスクリム。
  • ステータスバーのコンテンツの色: ステータスバーのコンテンツ(時刻やアイコンなど)の色を制御します。
ステータスバーのコンテンツの色を示す画像
図 3.ステータスバーのコンテンツの色。

themes.xml ファイルを編集して、ナビゲーション バーの色を設定できます。また、必要に応じて、ステータスバーを透明に、ステータスバーのコンテンツ色を濃い色に設定できます。

<!-- values-v29/themes.xml -->
<style name="Theme.MyApp">
  <item name="android:navigationBarColor">
     @android:color/transparent
  </item>

  <!-- Optional: set to transparent if your app is drawing behind the status bar. -->
  <item name="android:statusBarColor">
     @android:color/transparent
  </item>

  <!-- Optional: set for a light status bar with dark content. -->
  <item name="android:windowLightStatusBar">
    true
  </item>
</style>

WindowInsetsController API は直接使用できますが、可能であればサポート ライブラリ WindowInsetsControllerCompat を使用することを強くおすすめします。ステータスバーのコンテンツの色を制御するには、theme.xml の代わりに WindowInsetsControllerCompat API を使用します。そのためには、setAppearanceLightNavigationBars() 関数を使用して true を渡し、ナビゲーションの前景色を明るい色に変更するか、false をデフォルトの色に戻します。

Kotlin

val windowInsetsController =
      ViewCompat.getWindowInsetsController(window.decorView)

windowInsetsController?.isAppearanceLightNavigationBars = true

Java

WindowInsetsControllerCompat windowInsetsController =
      ViewCompat.getWindowInsetsController(getWindow().getDecorView());
if (windowInsetsController == null) {
    return;
}

windowInsetsController.setAppearanceLightNavigationBars(true);