アイリッジ開発者ブログ

アイリッジに所属するエンジニアが技術情報を発信していきます。

Android15の全画面対応に全力で逆らってみた

全国の楕円球を愛する皆様 こんにちは。
プロダクト開発部 SDKチームの岡です。

Android15の変更内容はご覧になりましたでしょうか?
https://developer.android.com/about/versions/15/summary?hl=en

Edge-to-edge enforcement

アプリが Android 15(API レベル 35)をターゲットとしている場合、Android 15 を実行しているデバイスでは、アプリはデフォルトでエッジツーエッジになります。
Android15からは強制的にデフォルトで全画面ね。と書かれております。

しかしながら、開発者の方の中には、
「Android14と同じ画面にしてくれとクライアントから言われてる」「急に全画面とか言われても」 「前と同じ画面じゃないと嫁に怒られる」「全画面に対応してると夕飯の支度に間に合わない」
などいろいろ理由もあり、全画面のままではいられない、そんな枕を涙で濡らす方も多いでしょう。

Edge-to-edgeとは一体どういうことになるか

ということの確認として、
まずは手元にリストを表示させるだけの簡単なアプリを用意しました。


MainActivity.kt

class MainActivity : AppCompatActivity() {
    var list: ListView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val actionbar = supportActionBar
        if (actionbar != null) {
            actionbar.setTitle("アイリッジ開発者ブログ")
        }
        
        list = findViewById<ListView>(R.id.list)
        val adapter = ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            mutableListOf(
                "リスト1",
                "リスト2",
                "リスト3",
                "リスト4",
                "リスト5",
                "リスト6",
                "リスト7",
                "リスト8",
                "リスト9",
                "リスト10",
                "リスト11",
                "リスト12",
                "リスト13",
                "リスト14",
                "リスト15",
                "リスト16",
                "リスト17",
                "リスト18",
                "リスト19",
                "リスト20"
            )
        )
        list?.adapter =adapter
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

テーマ設定

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:theme="@style/Theme.Design.Light">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Android14とAndroid15で比較してみます

Android14 (TargekSDK34)
Android15(TargekSDK35)

結果

右側のAndroid15(TargetSDK35)でビルドした場合は、とてもひどいですね。
上下真っ白で、ステータスバーの文字色が被っており時刻やWi-Fiアイコンなどが視認できません。

全画面対応への反逆

サクッとソースに記述して、元のAndroid14と同じ画面に戻るようにしちゃいましょう

// 上のステータスバーの時を戻す
window.isStatusBarContrastEnforced = true

// 上のナビゲーションバーの時を戻す
window.isNavigationBarContrastEnforced = true

// 下のナビゲーションバーを漆黒の闇に染める
window.navigationBarColor = Color.BLACK

再ビルド

(んん・・・??思ってたんと違う・・・)

上の対応だけでは上下のめりこみは解消してないですね。

再調整

こんな時は、レイアウトファイルに

android:fitsSystemWindows="true"

を追加するか、ソース上で

val content = this.findViewById<ViewGroup>(android.R.id.content)
val container = content.getChildAt(0) as ViewGroup
container.fitsSystemWindows = true

記述してみると・・・?

いいですね。元通りになりました。

以上です!