この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発や Javaでの開発を始めたい方への案内は、記事の最後で紹介します)
Android16のedge-to-edgeオプトアウト廃止に対応する
Android15のアップデート対象のPixel 9aのSIMフリーモデルです。
ポイント
Android15以上をターゲットとするアプリでいくつかの変更に対応する必要があります。
その中で変更の影響を受けるedge-to-edgeの対応が必要です。
動作の変更点: Android 15 以上をターゲットとするアプリ
Android16ではwindowOptOutEdgeToEdgeEnforcementによるオプトアウトを廃止することを発表しています。
edge-to-edgeオプトアウト廃止の対応について、実装方法を紹介いたします。
エッジ ツー エッジの対応
エッジ ツー エッジ(edge-to-edge)は全画面をアプリ領域として使うことができ、アプリを使っているときの没入感をより高められる機能です。
これまでは全画面モードと呼ばれ、ステータスバーやナビゲーションバーの表示をコードで制御していました。
Android15ではアプリのtargetSdkを35(Android15)にすると、強制的にエッジ ツー エッジが適用され、アプリの表示領域にステータスバーとナビゲーションバーが被さって表示されるようになります。
アプリの対応としては、ステータスバーとナビゲーションバーを表示するときにアプリ領域に被らないように制御するか、エッジ ツー エッジを無効にする方法があります。
◎全画面モードの有効化
◎エッジ ツー エッジの無効化
エッジ ツー エッジをAndroid14以下に適用する
エッジ ツー エッジを無効化できない場合、ステータスバーやナビゲーションバーをアプリ領域に被らないようにレイアウトを制御する必要があります。
エッジ ツー エッジの強制適用はAndroid15以上をターゲットとするアプリですが、Android14以下においてもエッジ ツー エッジを適用することでレイアウト制御の共通化が図れます。
◎build.gradle(モジュール)
dependencies {
    …
    implementation 'androidx.activity:activity:1.10.1'
    …
}◎MainActivity.java
    : 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
            overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, android.R.anim.fade_in, android.R.anim.fade_out);
            overrideActivityTransition(Activity.OVERRIDE_TRANSITION_CLOSE, android.R.anim.fade_out, android.R.anim.fade_in);
        }
        EdgeToEdge.enable(this, 
                Build.VERSION.SDK_INT < Build.VERSION_CODES.Q ? SystemBarStyle.dark(getColor(R.color.black)) : windowLightSystemBar() ?
                SystemBarStyle.light(Color.TRANSPARENT, Color.TRANSPARENT) : SystemBarStyle.dark(Color.TRANSPARENT),
                Build.VERSION.SDK_INT < Build.VERSION_CODES.Q ? SystemBarStyle.dark(getColor(R.color.black)) : windowLightSystemBar() ?
                SystemBarStyle.light(Color.TRANSPARENT, Color.TRANSPARENT) : SystemBarStyle.dark(Color.TRANSPARENT));
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            getWindow().setNavigationBarContrastEnforced(false);
        }
        :
    }
    :
    private boolean windowLightSystemBar() {
        TypedValue typedValue = new TypedValue();
        getTheme().resolveAttribute(android.R.attr.windowLightStatusBar, typedValue, true);
        return typedValue.data != 0;
    }Android14以下においてもエッジ ツー エッジを有効化する場合、EdgeToEdge.enableを使用します。
その際にシステムバーのスタイルをライトモードかダークモードを判断して設定する必要があります。
ライトモードかダークモードの判断はテーマ属性の値(TypedValue)で判断します。
サンプルコードではステータスバーとナビゲーションバーのコントラストと透過を指定しています。
レイアウト制御
ステータスバーやナビゲーションバーをアプリ領域に被らないようにステータスバーやナビゲーションバーの高さを取得して、画面の位置を変更します。

◎MainActivity.java
    : 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        :
        setContentView(R.layout.activity_main);
       View main = findViewById(R.id.main);
        ViewCompat.setOnApplyWindowInsetsListener(main, new OnApplyWindowInsetsListener() {
            @NonNull
            @Override
            public WindowInsetsCompat onApplyWindowInsets(@NonNull View view, @NonNull WindowInsetsCompat insets) {
                Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                return insets;
            }
        });
        :
    }ViewCompat.setOnApplyWindowInsetsListenerでステータスバーのインセットを取得し、画面を位置を変更します。
getInsetsにType.systemBars()、Type.navigationBars()やType.ime()を指定することで、それぞれインセットを取得できます。
◎activity_main.xml
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black">
    <ImageView
        android:id="@+id/back_ground"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha="0.5"
        android:scaleType="centerCrop"
        android:src="@drawable/background"
        tools:ignore="ContentDescription,ImageContrastCheck" />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="UselessParent">
    :エッジ ツー エッジ表示が有効にならないことがあります
edge-to-edgeに対応したアプリのリリース後、GooglePlay Consoleに「一部のユーザーでエッジ ツー エッジ表示が有効にならないことがあります」とメッセージが表示されることがあります。
アプリがエッジ ツー エッジに対応していても、インポートしているライブラリが対応していない場合があります。
このメッセージはエッジ ツー エッジに対応していないライブラリを変更しないかぎり消せないようです。

今回は、ここまでです。
edge-to-edgeに対応しているAndroidアプリです。
誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちらから、お願いいたします♪
ポチッとして頂けると、
次のコンテンツを作成する励みになります♪
これからAndroidのアプリ開発やJavaでの開発を始めたい方へ
アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。
オンラインスクールでの習得を、強くおススメします。
未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

 





コメント欄