Androidアプリ開発

全画面モードの有効化
(システムバーの非表示&透明化)

この記事は約12分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


アプリの画面サイズを最大化する全画面モードを有効にする

画面上の縁をタッチすると、半透明のシステムバーが表示されます

ポイント

標準のアプリ画面では、上側にステータスバー、下側(横画面では右側)にナビゲーションバーが表示されます。
動画や画像、ゲームなどのコンテンツでは、全画面で表示したくなる場面があります。
今回は、システムバーを非表示にした全画面表示の方法を紹介いたします。

全画面モードの有効化

アプリ優先型没入モード

アプリ優先型没入モードは画面の端からスワイプすると、半透明のシステムバーが表示されます。
システムバーに対して数秒間操作が行われなかった場合や、システムバー以外をタップするとシステムバーは非表示になります。

システムバーの非表示(hideSystemBar)

アプリ優先型没入モードを有効にするには、setSystemUiVisibilityを使用します。
ただし、API30で非推奨となり、API30以降は
WindowInsetsControllerを使用します。

    …
    private void hideSystemBar() {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
            WindowInsetsController windowInsetsController = getWindow().getDecorView().getWindowInsetsController();
            windowInsetsController.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars());
            windowInsetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
        } else {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
    }
    …

WindowInsetsControllerAPI30以降)を使用する場合、hideメソッドにWindowInsets.Type.statusBars(ステータスバー)とWindowInsets.Type.navigationBars(ナビゲーションバー)、setSystemBarsBehaviorメソッドにBEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE(スワイプで表示する半透明のナビゲーションバー)をそれぞれ指定します。

setSystemUiVisibility(API29以前)の引数として、SYSTEM_UI_FLAG_IMMERSIVE_STICKY(スワイプで表示する半透明のナビゲーションバー)、SYSTEM_UI_FLAG_FULLSCREEN(ステータスバーの非表示)、SYSTEM_UI_FLAG_HIDE_NAVIGATION(ナビゲーションバーの非表示)、SYSTEM_UI_FLAG_LAYOUT_STABLE(ナビゲーションバーが非表示になった時のレイアウト補正の有効化)、SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN(ステータスーが非表示になった時にレイアウト補正の有効化)を指定します。

hideSystemBarの使用方法

hideSystemBarの使用方法は、ActivityOnCreateの先頭で呼び出します。

    …
    // onCreate //
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        hideSystemBar();
        …

非表示のシステムバーがSpinnerのドロップダウンで表示される現象の回避策はコチラです↓↓↓

システムバーの透明化

システムバーの非表示ではなく、透明にすることで画面の表示領域を拡大します。

ステータスバーは透明ではなく、グレー透過色を使用しています

システムバーの透明化

システムバーを透明にする場合、システムバーを透過させて、背景(アプリ領域)を表示させるので、ActivityonCreatesetDecorFitsSystemWindowsを使用して、アプリ領域をシステムバーの表示領域まで拡大します。
API29以上でシステムバーを透明にする場合、
setStatusBarContrastEnforcedsetNavigationBarContrastEnforcedfalseを設定します。

    …
    // onCreate //
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        …
        setContentView(R.layout.activity_main);
        WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            getWindow().setStatusBarContrastEnforced(false);
            getWindow().setNavigationBarContrastEnforced(false);
        }
        … 

◎テーマ(themes.xml)

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme." parent="Theme.AppCompat.Light.NoActionBar">
     … 
        <!-- SystemBar color. -->
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="android:windowLightStatusBar">true</item>
     … 
    </style>
</resources>
    …

システムバーの色をアプリ全体に適用するために、テーマに作成します。
windowDrawsSystemBarBackgroundstrueを指定することで、システムバーの背景を描画します。
windowLightStatusBartrueを指定することで、ステータスバーの文字をハイライトにします。

◎マニュフェスト(AndroidManifest.xml)

    …
    <application
     …
        android:theme="@style/Theme.archive"
     … 

アプリのテーマに作成したテーマを指定します。

今回は、ここまでです。

全画面モードを有効化(システムバーの非表示)している Androidアプリです。
動画の再生画面を最大化するために全画面モードを有効化しています。

アクションカメラの定番といえば、やっぱりコレですね♪