web-dev-qa-db-ja.com

アラートダイアログの表示中にステータスバーを非表示にするAndroid

特定のボタンを押すとアラートダイアログがポップアップするアプリを作っています。ステータスバーを非表示にする必要があるため、アクティビティにメソッドがあります。

private void hideStatusBar(){
    if (Build.VERSION.SDK_INT < 16){
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    else {
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

このメソッドをアクティビティのonCreateメソッドで呼び出しますが、アラートダイアログがポップアップするまで正常に機能します。警告ダイアログが表示されるとすぐに、ステータスバーが戻ります。私は以下を試しました:

alertDialog.show();
hideStatusBar();

次に、アクティビティのonWindowFocusChangedメソッドをオーバーライドしました。

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    hideStatusBar();
}

これにより、ステータスバーの背景が透明になりますが、非表示にはなりません。アラートダイアログが表示されたときにステータスバーを非表示にしておく方法はありますか?

13
Thomas

各ダイアログには、独自のスタイルを持つ独自のウィンドウがあります。

あなたの場合、hideStatusBar()は、アクティビティのonCreate()から呼び出されるため機能しません。これは、ダイアログのウィンドウではなく、アクティビティのウィンドウの外観を変更しようとすることを意味します。

解決策は:

サブクラスAlertDialog。そこに移動してhideStatusBar()し、ダイアログのonCreate()から呼び出します。

つまり、Dialog.getWindow()ではなくActivity.getWindow()と取引する必要があるということです。

ここに少しサンプルがあります:

public static class TranslucentDialog extends AlertDialog {
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}
6

AlertDialog.Builderを使用してAlertDialogを作成し、AlertDialogを作成します。
show()を呼び出す前に、ダイアログのウィンドウフラグをフォーカス不可に設定します。
ダイアログを表示した後、AlertDialogを表すウィンドウのdecorViewにSystemUiVisibilityフラグを設定し、フォーカスできないフラグをクリアします。

    AlertDialog.Builder adBuilder = new AlertDialog.Builder(this);
    AlertDialog alertDialog = adBuilder.setCancelable(false).
            setMessage("Turn ended, Click OK").
            setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                }
            }).create();
    alertDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    alertDialog.show();
    alertDialog.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
    alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);

AlertDialogが表示されると、SystemUI要素は表示されません。お役に立てれば。

4