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

Posted

技术标签:

【中文标题】具有清晰背景的 DialogFragment(未变暗)【英文标题】:DialogFragment with clear background (not dimmed) 【发布时间】:2012-11-29 03:48:22 【问题描述】:

我试图让DialogFragment 的背景完全清晰。

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

通过将 android:windowIsFloating 设置为 false,我得到了我想要的清晰背景,但 DialogFragment 炸毁了大约 95% 的屏幕, 在它周围只留下一个很小的间隙,您可以看到它所覆盖的视图。

我尝试了很多调整,但似乎无法覆盖此行为。

是否需要使用PopupWindow才能达到想要的效果,或者有什么风格 我可以覆盖的项目?

【问题讨论】:

我刚刚遇到了 LayoutParameter 标志 WindowManager.LayoutParams.FLAG_DIM_BEHIND。希望这能做到…… 【参考方案1】:

对我有用的是调整onStart() 中的WinowManager.LayoutParams 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);

【讨论】:

+1,为我工作。对于完全没有暗淡,请使用windowParams.dimAmount = 0;。此外,您必须在onStart() 中执行此操作,而不是在onCreateView() 为什么它只在onStart() 有效,为什么在onCreateView() 无效? @zIronManBox 对话框尚未在onCreateView() 中呈现/实例化。 @Jonik 不,你不需要联系windowParams.dimAmount。只需从windowParams.flags 中删除WindowManager.LayoutParams.FLAG_DIM_BEHIND 此解决方法仍在工作 2021.11.18【参考方案2】:

使用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;

注意:此答案适用于 DialogFragmentBottomSheetDialogFragment

【讨论】:

为我工作window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)【参考方案3】:

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

DialogFragment dialog;

...

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

我是从 Aleks G 对Changing position of the Dialog on screen android 的回答中得到的。

【讨论】:

【参考方案4】:

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

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

【讨论】:

这也会删除对话框标题

以上是关于具有清晰背景的 DialogFragment(未变暗)的主要内容,如果未能解决你的问题,请参考以下文章

制作具有清晰背景的 SwiftUI 视图?

如何创建具有清晰背景的按钮

具有清晰背景的 Segue 推送动画在 iOS 7 上闪烁

具有清晰背景的 UISlider 拇指图像在其后面显示轨道

SwiftUI:自定义按钮无法识别具有清晰背景和 buttonStyle 的触摸

手把手带你玩转 DialogFragment