我正在尝试让
DialogFragment
的背景完全清晰。
将样式项
android:windowIsFloating
设置为true(默认),
DialogFragment
完全按照我想要的方式显示,但背景非常暗。
通过将
android:windowIsFloating
设置为 false,我得到了我想要的清晰背景,但是 DialogFragment 会占据屏幕的大约 95%,
它周围只留下一个微小的间隙,您可以透过它看到它覆盖的视图。
我已经尝试了大量的调整,但似乎无法覆盖这种行为。
我需要使用
PopupWindow
才能达到想要的效果吗,或者有什么风格吗
我可以覆盖哪些项目?
对我有用的是调整
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);
}
使用
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
您需要获取 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 的回答中得到它。
更简单的解决方案是在 DialogFragment 的 onCreate 中更改样式:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, getTheme());
}
此外,模拟器也会出现问题: 设置 -> 系统 -> 开发者选项 -> 硬件加速渲染 -> 允许窗口级模糊