web-dev-qa-db-ja.com

背景がクリアなDialogFragment(淡色表示なし)

DialogFragmentの背景を完全に明確にしようとしています。

スタイルアイテムを設定するとAndroid:windowIsFloatingをtrue(デフォルト)にすると、DialogFragmentは希望どおりに表示されますが、背景が非常に暗くなります。

設定することにより Android:windowIsFloating falseにすると、必要な背景がクリアになりますが、DialogFragmentは画面の約95%まで拡大し、オーバーレイするビューまで透けて見える小さなギャップしか残しません。

私はたくさんの調整を試みましたが、この動作を無効にすることはできないようです。

目的の効果を得るにはPopupWindowを使用する必要がありますか、それともオーバーライドできるスタイルアイテムがいくつかありますか?

23
samis

私にとってうまくいくのは、 DialogFragmentonStart()WinowManager.LayoutParamsを調整することです。

@Override public void onStart() {
    super.onStart();

    Window window = getDialog().getWindow();
    WindowManager.LayoutParams windowParams = window.getAttributes();
    windowParams.dimAmount = 0.90f;
    windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
    window.setAttributes(windowParams);
}
74

独自のカスタマイズダイアログを作成し、FragmentDailogで拡張し、このメソッドをオーバーライドします

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);

    //set the dialog to non-modal and disable dim out fragment behind
    Window window = dialog.getWindow();
    window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    return dialog;
}

注:この回答は、DialogFragmentおよびBottomSheetDialogFragmentの場合に機能します

5
Abhishek

DialogFramentへのハンドルを取得する必要があり(.showが呼び出された後)、PostedRunnableでこれを実行します。

DialogFragment dialog;

...

WindowManagerLayoutParams wlp = dialog.Dialog.Window.Attributes;
wlp.Flags &= ~WindowManagerFlags.DimBehind;
dialog.Dialog.Window.Attributes = wlp;

Android画面でのダイアログの位置の変更 に対するAleksGの回答から得ました。

3
samis

さらに簡単な解決策は、DialogFragmentのonCreateでスタイルを変更することです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_FRAME, getTheme());
}
2
Andrey Petrov