DialogFragment
の背景を完全に明確にしようとしています。
スタイルアイテムを設定するとAndroid:windowIsFloating
をtrue(デフォルト)にすると、DialogFragment
は希望どおりに表示されますが、背景が非常に暗くなります。
設定することにより Android:windowIsFloating
falseにすると、必要な背景がクリアになりますが、DialogFragmentは画面の約95%まで拡大し、オーバーレイするビューまで透けて見える小さなギャップしか残しません。
私はたくさんの調整を試みましたが、この動作を無効にすることはできないようです。
目的の効果を得るにはPopupWindow
を使用する必要がありますか、それともオーバーライドできるスタイルアイテムがいくつかありますか?
私にとってうまくいくのは、 DialogFragment のonStart()
の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);
}
独自のカスタマイズダイアログを作成し、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
の場合に機能します
DialogFramentへのハンドルを取得する必要があり(.showが呼び出された後)、PostedRunnableでこれを実行します。
DialogFragment dialog;
...
WindowManagerLayoutParams wlp = dialog.Dialog.Window.Attributes;
wlp.Flags &= ~WindowManagerFlags.DimBehind;
dialog.Dialog.Window.Attributes = wlp;
Android画面でのダイアログの位置の変更 に対するAleksGの回答から得ました。
さらに簡単な解決策は、DialogFragmentのonCreateでスタイルを変更することです。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, getTheme());
}