プログラミング

【Android開発】API29でステータスバーを非表示にしたとき全画面にならない

現象

AndroidエミュレータのGoogle Pixel 4(APIレベル29)にて
ステータスバー非表示処理を入れて実行したところ
上部にステータスバー分の余白が残ってViewが全画面表示されないという問題が発生しました。

色が付いているところは描画範囲なのですが、
画面上部の黒いところは不可侵領域みたいになっちゃって手を出せません。

対策

styles.xmlに以下の設定が必要でした。

<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

一応全文。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Black.NoTitleBar.Fullscreen">
        <!-- Customize your theme here. -->
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
</resources>

API27以降の設定のようなのでminSDKが低い場合values-v27フォルダに置く必要があります。
(Android Studioが半自動でやってくれる)

あと当然なのですがAndroidManifest.xmlからスタイル指定するのをお忘れなく。

android:theme="@style/AppTheme"


無事全画面になりました。

なおナビゲーションバーの非表示は別途処理しています。

他に試したこと(失敗例)

<item name="android:windowTranslucentStatus">true</item>

これをやると、ステータスバーが半透明になって
Viewの描画自体は思惑通り全画面になってくれる。

それをベースとして、ステータスバーの色情報いじって完全透明にすれば実質非表示か?とか思ったけど
(そもそもできるかわからない。APIレベルが高くないと無理な気はした)

ゴリ押し感がすごいし、ステータスバーの高さ取得したとき0になってほしいのにならないしとかで
絶対もっとスマートなやり方あるよなぁと思い最初に書いた方法に行きつきました。