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

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

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

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

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

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

【问题讨论】:

  • 我刚刚遇到了 LayoutParameter 标志 WindowManager.LayoutParams.FLAG_DIM_BEHIND。希望这能做到……

标签: android background android-dialogfragment


【解决方案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());
    }
    

    【讨论】:

    • 这也会删除对话框标题
    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多