$30 off During Our Annual Pro Sale. View Details »

Android15(SDK35)から強制される、Edge-to-Edgeに対応しなければならない

SansanTech
September 25, 2024

 Android15(SDK35)から強制される、Edge-to-Edgeに対応しなければならない

■ イベント
【ハイブリット開催】Mobile勉強会 ウォンテッドリー × チームラボ × Sansan #16
https://teamlab.connpass.com/event/329937/

■ 発表者
技術本部 Sansan Engineering Unit Mobile Application Group 原田 拓眞

■ Android エンジニア採用情報
https://media.sansan-engineering.com/android-engineer

■ Sansan Tech Blog
https://buildersbox.corp-sansan.com/

SansanTech

September 25, 2024
Tweet

More Decks by SansanTech

Other Decks in Technology

Transcript

  1. 自己紹介 ⁃ 2014年4月Sansan新卒入社 ⁃ C# / webアプリエンジニアでした ⁃ 2018年11月頃からAndroidに転向 ⁃

    現在はSansanのAndroidアプリアーキテクト ⁃ 今年の3月から犬を飼い始めました ⁃ X: @teufelium
  2. Edge-to-Edgeがデフォルトに! ⁃ Target SDK35にしていて、Android 15 [V]以上のデバイスで動か した場合、デフォルトEdge-to-Edge有効になります。 ⁃ Edge-to-Edge自体はAndroid 10

    [Q] (SDK 29)から存在していて、 任意に開発者が有効にすることができました。 ⁃ Material3に対応したJetpack Compose androidx.compose.material3 を使用している場合はいい感じに対 応してくれるので、追加対応がほとんど不要。 https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge
  3. 修正内容(Jetpack Composeでの対応) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Android15未満でもEdge-to-Edgeを有効にする。

    // 環境ごとにEdge-to-Edgeかどうかが異なると思わぬ体験不良が有るかも? enableEdgeToEdge() setContent { SansanAndroidTheme { Surface( modifier = Modifier .fillMaxSize() .safeDrawingPadding() // 被らない部分に配置してくれる ) { ... } } } }
  4. 修正内容(AndroidViewでの対応) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this,

    R.layout.xxx_activity) // Android15未満でもEdge-to-Edgeを有効にする。 enableEdgeToEdge() // 親Viewに対して、インセットの適用を行う。 // ステータスバーやナビゲーションバーの高さ分のmarginが自動的に設定される。 ViewCompat.setOnApplyWindowInsetsListener(binding.rootView) { view, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) view.updateLayoutParams<ViewGroup.MarginLayoutParams> { leftMargin = insets.left topMargin = insets.top bottomMargin = insets.bottom rightMargin = insets.right } WindowInsetsCompat.CONSUMED } }
  5. 修正内容(Jetpack Composeでの対応) Scaffold( modifier = modifier, topBar = { Column(Modifier.background(SansanColor.BackgroundGrayMainDuck))

    { // ステータスバー分の余白をあけるSpacerをつける。 Spacer( modifier = Modifier.windowInsetsTopHeight( WindowInsets.statusBars ) ) CompanyDetailToolbar( … ) } }
  6. 修正内容(AndroidViewでの対応) ViewCompat.setOnApplyWindowInsetsListener(binding.bottomContainer) { view, windowInsets -> // ナビゲーションバーに取られる高さ val insets

    = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) // IMEに取られる高さ val ime = windowInsets.getInsets(WindowInsetsCompat.Type.ime()) view.setPadding( insets.left, insets.top, insets.right, maxOf(insets.bottom, ime.bottom), // どっちかデカい方 ) WindowInsetsCompat.CONSUMED }
  7. まとめ ⁃ TargetSDK 35にするとAndroid 15以降の端末でEdge-to-Edgeが強制に なる。 ⁃ M3対応JetpackComposeはよしなに対応してくれるが、M2や AndroidViewでは自分たちで頑張る必要あり。 ⁃

    背景色の違和感を減らしたり、IMEに張り付くようなレイアウトをする 時はちょっと工夫の必要あり。 ⁃ 頑張りましょう。