免責事項:APIレベル30の時点でシステム可視性フラグが非推奨になっているため、受け入れられた回答はAPIレベル30まで非推奨なしで有効であるため、これは補足的な回答です。
setDecorFitsSystemWindows()
アプリにエッジ ツー エッジを実装します (つまり、アプリはコンテンツを拡張して画面全体に拡張し、システム ステータスとナビゲーション バーの両方をカバーします)。
これは、次のアクティビティで実装できます。
WindowCompat.setDecorFitsSystemWindows(window, false)
残りの部分は、システム ナビゲーション バーとの重複を避けることです。
ドキュメントに従って:
画面のどの部分がナビゲーション バーやステータス バーなどのシステム UI と交差するかを指定するインセットに対応することで、オーバーラップに対処できます。交差とは、単にコンテンツの上に表示されることを意味する場合もありますが、システム ジェスチャについてアプリに通知することもできます。
そのため、API レベル 30+ のインセットを処理して、アプリと下部のナビゲーション バーが重ならないようにする必要があります。
/*
* Making the Navigation system bar not overlapping with the activity
*/
if (Build.VERSION.SDK_INT >= 30) {
// Root ViewGroup of my activity
val root = findViewById<ConstraintLayout>(R.id.root)
ViewCompat.setOnApplyWindowInsetsListener(root) { view, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
// Apply the insets as a margin to the view. Here the system is setting
// only the bottom, left, and right dimensions, but apply whichever insets are
// appropriate to your layout. You can also update the view padding
// if that's more appropriate.
view.layoutParams = (view.layoutParams as FrameLayout.LayoutParams).apply {
leftMargin = insets.left
bottomMargin = insets.bottom
rightMargin = insets.right
}
// Return CONSUMED if you don't want want the window insets to keep being
// passed down to descendant views.
WindowInsetsCompat.CONSUMED
}
}
詳細については、ドキュメントを確認してください。
余分なセント:
<item name="android:windowTranslucentStatus">true</item>
下位の API レベルで使用する場合は、API-30 のテーマ/スタイルをオーバーライドする必要があります。つまりres\values-v30\themes.xml
、デフォルトのスタイルの を使用します (もちろん は使用しませんwindowTranslucentStatus
) 。