DialogFragment с чистым фоном (не затемнен)

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

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

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

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

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


person samis    schedule 11.12.2012    source источник
comment
Я только что наткнулся на флаг LayoutParameter WindowManager.LayoutParams.FLAG_DIM_BEHIND. Надеюсь, это получится...   -  person samis    schedule 11.12.2012


Ответы (4)


Что работает для меня, так это настроить 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);
}
person Christopher Perry    schedule 27.07.2013
comment
+1, у меня работает. Для отсутствия затемнения используйте windowParams.dimAmount = 0;. Кроме того, вы должны сделать это в onStart(), а не onCreateView(). - person Jonik; 29.11.2013
comment
Почему это работает только в onStart(), а не в onCreateView()? - person zIronManBox; 08.05.2015
comment
@zIronManBox Диалог еще не создан/не создан в onCreateView(). - person samis; 12.04.2018
comment
@Jonik Нет, тебе не нужно трогать windowParams.dimAmount. Просто удалите WindowManager.LayoutParams.FLAG_DIM_BEHIND из windowParams.flags - person fdermishin; 13.04.2018

Создайте собственное настраиваемое диалоговое окно с расширением 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

person Abhishek    schedule 22.09.2016
comment
у меня работает window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) - person Yaroslav Ovdiienko; 21.02.2020

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

DialogFragment dialog;

...

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

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

person samis    schedule 11.12.2012

Еще более простое решение — изменить стиль в onCreate DialogFragment:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_FRAME, getTheme());
}
person Andrey Petrov    schedule 10.04.2014
comment
Это также удаляет заголовок диалога - person velis; 16.11.2016