ステータスバーを非表示にする

このレッスンでは、さまざまなバージョンの Android でステータスバーを非表示にする方法について説明します。ステータスバー(および必要に応じてナビゲーション バー)を非表示にすると、コンテンツで使用される表示領域が増え、没入感のあるユーザー エクスペリエンスを提供できます。

図 1 は、ステータスバーが表示されたアプリを示しています。

システムバー

図 1. 表示状態のステータスバー

ステータスバーを非表示にした状態のアプリを図 2 に示します。アクションバーも非表示になっています。ステータスバーなしでアクションバーを表示しないでください。

システムバー

図 2. 非表示状態のステータスバー

ステータスバーを非表示にする(Android 4.0 以前)

Android 4.0(API レベル 14)以前では、WindowManager フラグを設定することでステータスバーを非表示にできます。これは、プログラムで行うか、アプリのマニフェスト ファイルでアクティビティ テーマを設定して行うことができます。ステータスバーをアプリ内で常に隠す場合は、アプリのマニフェスト ファイルでアクティビティのテーマを設定することをおすすめします(厳密に言えば、必要に応じてプログラムでテーマをオーバーライドすることもできます)。次に例を示します。

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

アクティビティ テーマを使用した場合、次のようなメリットがあります。

  • プログラムでフラグをセットするよりも、メンテナンスが簡単で、エラーを低減することができます。
  • これにより、アプリのメイン アクティビティをインスタンス化する前に UI のレンダリングに必要な情報が提供されるため、UI の遷移がよりスムーズになります。

または、プログラムで WindowManager フラグを設定することもできます。このアプローチにより、ユーザーがアプリを操作する際にステータスバーの表示 / 非表示を簡単に切り替えることができます。

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN)
        }
        setContentView(R.layout.activity_main)
    }
    ...
}

Java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        setContentView(R.layout.activity_main);
    }
    ...
}

WindowManager フラグを(アクティビティ テーマまたはプログラムによって)設定した場合、アプリがフラグをクリアしない限り、フラグは有効のままです。

FLAG_LAYOUT_IN_SCREEN を使用すると、FLAG_FULLSCREEN を有効にした際に使用可能な画面領域と同じ画面領域を使用するようにアクティビティ レイアウトを設定できます。これにより、ステータスバーの表示 / 非表示が切り替わったときにコンテンツのサイズを変更できなくなります。

ステータスバーを非表示にする(Android 4.1 以降)

Android 4.1(API レベル 16)以降では、setSystemUiVisibility() を使用してステータスバーを非表示にできます。setSystemUiVisibility() は、個々のビューレベルで UI フラグを設定します。これらの設定は、ウィンドウ レベルに集計されます。setSystemUiVisibility() を使用して UI フラグを設定すると、WindowManager フラグを使用する場合よりも、システムバーをより詳細に制御できます。ステータスバーを非表示にするスニペットを以下に示します。

Kotlin

// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
actionBar?.hide()

Java

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

次の点にご注意ください。

  • アクティビティから離れるなどして UI フラグがクリアされた後、バーを再度非表示にするには、アプリでフラグをリセットする必要があります。UI の表示設定変更をリッスンしてアプリがそれに対応できるようにする方法については、UI の表示設定変更に応答するをご覧ください。
  • UI フラグをセットする場所によって違いが生じます。アクティビティの onCreate() メソッドでシステムバーを非表示にした場合、ユーザーがホームボタンを押すと、システムバーが再表示されます。ユーザーがアクティビティを再び開いても、onCreate() は呼び出されないため、システムバーは表示されたままになります。ユーザーがアクティビティを出入りするときにシステム UI の変更が維持されるようにするには、onResume() または onWindowFocusChanged() で UI フラグを設定します。
  • メソッド setSystemUiVisibility() は、呼び出し元のビューが表示されている場合にのみ効果があります。
  • ビューから離れると、setSystemUiVisibility() で設定されたフラグがクリアされます。

コンテンツをステータスバーの背後に表示する

Android 4.1 以降では、アプリのコンテンツをステータスバーの背後に表示するよう設定できます。これにより、ステータスバーの表示と非表示が切り替わってもコンテンツのサイズを変更しないようにできます。そのためには、SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN を使用します。また、アプリのレイアウトを安定させるために、SYSTEM_UI_FLAG_LAYOUT_STABLE の使用が必要になる場合があります。

この方法を使用する場合は、アプリの UI の重要な部分(マップアプリの組み込みコントロールなど)がシステムバーで隠れないようにする必要があります。このような部分が覆われると、アプリが使用できなくなる可能性があります。ほとんどの場合、android:fitsSystemWindows 属性を XML レイアウト ファイルに追加して true に設定することで対処できます。これにより、親 ViewGroup のパディングが調整され、システム ウィンドウ用のスペースが確保されます。ほとんどのアプリにおいて、この対応で十分です。

ただし、アプリに必要なレイアウトを取得するために、デフォルトのパディングの変更が必要になることがあります。システムバー(ウィンドウの「コンテンツ インセット」と呼ばれるスペースを占有する)に対するコンテンツのレイアウト方法を直接操作するには、fitSystemWindows(Rect insets) をオーバーライドします。fitSystemWindows() メソッドは、ウィンドウのコンテンツ インセットが変更されると、ビュー階層によって呼び出され、それに応じてウィンドウがコンテンツを調整できるようにします。このメソッドをオーバーライドすると、必要に応じてインセット(したがってアプリのレイアウト)を処理できます。