Диалоговое изображение с четким фоном (не затемнено)

Я пытаюсь полностью понять фон DialogFragment.

При установке элемента стиля android:windowIsFloating в значение true (по умолчанию) DialogFragment отображает точно, как я хочу, но имеет очень тусклый фон.

Установив android:windowIsFloating на false, я получаю ясный фон, который я хочу, но DialogFragment срабатывает примерно до 95% экрана, оставляя лишь крошечный промежуток вокруг него, где вы можете видеть, что он накладывается.

Я пробовал тонну настроек и не могу игнорировать это поведение.

Нужно ли использовать PopupWindow для достижения желаемых эффектов, или есть какой-то стиль элементы, которые я могу переопределить?

Ответ 1

Что для меня работает, это настроить WinowManager.LayoutParams в onStart() DialogFragment:

@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);
}

Ответ 2

Вам нужно получить дескриптор вашего DialogFrament (через некоторое время после вызова .show), и сделайте это в объявленном Runnable:

DialogFragment dialog;

...

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

Я получил от Aleks G ответ на Изменение положения диалогового окна на экране Android.

Ответ 3

Даже более простым решением является изменение стиля в onCreate диалогового окна:

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

Ответ 4

Создайте свой собственный настраиваемый диалог с помощью 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