具有清晰背景的DialogFragment(未变暗)

问题描述 投票:0回答:5

我正在尝试让

DialogFragment
的背景完全清晰。

将样式项

android:windowIsFloating
设置为true(默认),
DialogFragment
完全按照我想要的方式显示,但背景非常暗。

通过将

android:windowIsFloating
设置为 false,我得到了我想要的清晰背景,但是 DialogFragment 会占据屏幕的大约 95%, 它周围只留下一个微小的间隙,您可以透过它看到它覆盖的视图。

我已经尝试了大量的调整,但似乎无法覆盖这种行为。

我需要使用

PopupWindow
才能达到想要的效果吗,或者有什么风格吗 我可以覆盖哪些项目?

android background android-dialogfragment
5个回答
85
投票

对我有用的是调整

DialogFragment
WinowManager.LayoutParams
中的 onStart()

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

8
投票

使用

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


3
投票

您需要获取 DialogFrament 的句柄(在调用 .show 之后的某个时间), 并在 Posted Runnable 中执行此操作:

DialogFragment dialog;

...

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

我从 Aleks G 对 Changingposition of the Dialog on screen android 的回答中得到它。


1
投票

更简单的解决方案是在 DialogFragment 的 onCreate 中更改样式:

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

0
投票

此外,模拟器也会出现问题: 设置 -> 系统 -> 开发者选项 -> 硬件加速渲染 -> 允许窗口级模糊

© www.soinside.com 2019 - 2024. All rights reserved.