Android15 + targetSdk 35 で EdgeToEdge レイアウトがデフォルトで有効になりました。
targetSdkを35にあげたいけど、EdgeToEdgeにしてしまうとレイアウトが崩れてしまい有効にできないという人も多いことでしょう。
一時的に回避するために windowOptOutEdgeToEdgeEnforcement というAPIもありますが、こいつはAndroidの公式ドキュメント内で言及されているのを見つけられずいまいち信憑性にかけます。
そこで、WindowInsetsを取得して、EdgeToEdgeで増える分の領域をマージンとして設定してあげることでとりあえず見た目を保証するというアプローチを考えてみました。
コードは以下です。
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM) {
ViewCompat.setOnApplyWindowInsetsListener(rootView) { view, windowInsets ->
val insets = windowInsets.getInsets(
WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout(),
)
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = insets.top
leftMargin = insets.left
rightMargin = insets.right
bottomMargin = insets.bottom
}
WindowInsetsCompat.CONSUMED
}
}
これをActivityのRootViewに対して動かしてあげることで広がった領域を無効化することができます。注意点としてはMarginとして広げているので、StatusBar等の背景色を意図して色に設定してあげる必要があります。
Androidの方針としてはEdgeToEdgeに対応したアプリ・レイアウトを実装していくべきなので、一時しのぎしつついい感じの実装にしていけるとよいですね。
参考