0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Androidのエッジツーエッジで広がる領域にマージンを被せて無効化してみる

Posted at

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に対応したアプリ・レイアウトを実装していくべきなので、一時しのぎしつついい感じの実装にしていけるとよいですね。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?