2012-12-11 31 views
16

Tôi đang cố gắng để có được nền tảng của một DialogFragment để được hoàn toàn rõ ràng.DialogFragment với nền rõ ràng (không bị mờ)

Khi đặt mục kiểu android:windowIsFloating thành đúng (mặc định), màn hình DialogFragment hiển thị chính xác cách tôi muốn, nhưng có một nền rất mờ.

Bằng cách đặt android:windowIsFloating thành sai, tôi nhận được nền tảng rõ ràng mà tôi muốn, nhưng DialogFragment thổi lên khoảng 95% màn hình, chỉ để lại một khoảng trống nhỏ xung quanh nơi bạn có thể nhìn xuyên qua lớp phủ.

Tôi đã thử các chỉnh sửa của tấn và dường như không thể ghi đè hành vi này.

Tôi có cần sử dụng PopupWindow để đạt được hiệu quả mong muốn hoặc có một số kiểu mục mà tôi có thể ghi đè không?

+0

tôi vừa bắt gặp WindowManager.LayoutParams.FLAG_DIM_BEHIND LayoutParameter cờ. Hy vọng rằng điều này sẽ làm điều đó ... – samosaris

Trả lời

53

gì làm việc cho tôi là để điều chỉnh WinowManager.LayoutParams trong onStart() của 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); 
} 
+0

Rất sạch sẽ ... Tôi sẽ xem nếu tôi có thể sử dụng điều này. Cảm ơn! – samosaris

+4

+1, phù hợp với tôi. Đối với ** không mờ ở tất cả **, sử dụng 'windowParams.dimAmount = 0;'. Ngoài ra, bạn phải làm điều này trong 'onStart()', không phải 'onCreateView()'. – Jonik

+1

Tại sao nó chỉ làm việc trong 'onStart()' tại sao không trong 'onCreateView()'? – zIronManBox

3

Bạn cần để có được một tay cầm để DialogFrament của bạn (đôi khi sau .show được gọi), và làm điều này trong một Runnable đăng:

DialogFragment dialog; 

... 

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

tôi đã nhận nó từ câu trả lời Aleks G để Changing position of the Dialog on screen android.

2

Ngay cả một giải pháp đơn giản là thay đổi phong cách trong onCreate của DialogFragment:

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

Điều này cũng loại bỏ tiêu đề hộp thoại – velis

1

Tạo hộp thoại Tùy chỉnh của riêng bạn mở rộng với FragmentDailog và ghi đè phương pháp này

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

Chú ý: Câu trả lời này làm việc cho tôi trong trường hợp DialogFragmentBottomSheetDialogFragment

Các vấn đề liên quan