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

时间:2012-12-11 15:19:35

标签: android background android-dialogfragment

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

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

通过将android:windowIsFloating设置为false,我得到了我想要的清晰背景,但DialogFragment会爆炸到屏幕的大约95%, 只留下一个小小的空隙,你可以看到它覆盖的视图。

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

我是否需要使用PopupWindow来实现所需的效果,或者是否有某种风格 我可以覆盖的项目?

4 个答案:

答案 0 :(得分:71)

对我有用的是调整DialogFragmentWinowManager.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);
}

答案 1 :(得分:3)

您需要获取DialogFragment的句柄(在调用.show之后的某个时间), 并在发布的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的回答中得到的。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

,此答案适用于我