Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Edge-to-edge「強制」への対応

 Edge-to-edge「強制」への対応

Ryo WATANABE

August 09, 2024
Tweet

Other Decks in Technology

Transcript

  1. 自己紹介 • 渡邊 亮 @error96num | ©Ryo • STORES株式会社 -

    STORES ブランドアプリ • Androidエンジニア 3年ほど 2
  2. Edge-to-edgeが「強制」されるとは 7 targetSdk 34 × 端末 API level 35 (Android

    15) https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge targetSdk 35 × 端末 API level 35 (Android 15) Edge-to-edge enforcement Apps are edge-to-edge by default on devices running Android 15 if the app is targeting Android 15 (API level 35). Edge-to-edge でない Edge-to-edge
  3. Edge-to-edgeが「強制」されるとは 8 targetSdk 34以下 targetSdk 35 端末 API level 35

    (Android 15) 非適用 適用  👈 端末 API level 34 (Android 14) 以下 非適用 非適用 デフォルトで Edge-to-edge が適用される / されない https://developer.android.com/develop/ui/views/layout/edge-to-edge#enable-edge-to-edge-display This is 強制 targetSdk 34 までのアプリでは Activity の onCreate で enableEdgeToEdge を呼ぶことで初めて適用されていた override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) ... }
  4. 強制されると あなたのアプリのレイアウトが大変なことになる(かも) 9 targetSdk 34 × 端末 API level 35

    (Android 15) Edge-to-edge 未対応 targetSdk 35 × 端末 API level 35 (Android 15) Edge-to-edge が強制された状態 https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge
  5. 大変なことにならないように アプリのViewを適切に「ズラす」必要がある  10 targetSdk 34 × 端末 API level 35

    (Android 15) Edge-to-edge 未対応 targetSdk 35 × 端末 API level 35 (Android 15) Edge-to-edge が強制された状態 → WindowInsetsを考慮してViewをズラす https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge
  6. 「WindowInsetsを考慮してViewをズラす」の例 11 ・https://developer.android.com/codelabs/edge-to-edge#2 ・https://github.com/android/socialite/pull/77 Scaffold( ... ) { innerPadding ->

    Column { val layoutDirection = LocalLayoutDirection.current ... InputBar( ... - contentPadding = PaddingValues(0.dp), ‘ + contentPadding = innerPadding.copy(layoutDirection, top = 0.dp), ‘ ... ) } } ... BEFORE AFTER Scaffoldの場合、ここに WindowInsetsの情報が含まれる
  7. targetSdk 35 でも Edge-to-edgeの強制 をオプトアウトできる 17 https://github.com/error96num/nowinandroid/commit/5aec23693a0e34ca6c67c5bb9a110d7099a57273 <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application>

    <activity android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity" android:theme="@style/Theme.OptOutEdgeToEdgeEnforcement" /> <activity android:name="com.google.android.gms.oss.licenses.OssLicensesActivity" android:theme="@style/Theme.OptOutEdgeToEdgeEnforcement" /> </application> </manifest> 1. AndroidManifest で Activity にカスタムテーマを設定する <style name="Theme.OptOutEdgeToEdgeEnforcement" parent="Theme.AppCompat"> <item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item> </style> 2. テーマの android:windowOptOutEdgeToEdgeEnforcement の属性を true にする 👈nowinandroidで試しました
  8.   オプトアウトは将来的にdisabledになるので 利用は最小限に! 18 If this is true, the edge-to-edge

    enforcement won’t be applied. However, this attribute will be deprecated and disabled in a future SDK level. public static final int windowOptOutEdgeToEdgeEnforcement https://developer.android.com/reference/android/R.attr#windowOptOutEdgeToEdgeEnforcement
  9. 何はともあれ... 今日から Edge-to-edge に対応しましょう! 19   targetSdkを35に上げる方 へ • Edge-to-edge対応は

    一つひとつの画面でInsetsを適切に処理する 骨の折れる作業 • 暫定策としてのオプトアウトが残されているので気負わなくていい • 恒久的には やはりすべての画面を対応させる必要がありそう • 既に Edge-to-edge対応済みのアプリも「強制」による影響がないか確認する