Làm thế nào để loại bỏ một DialogFragment khi nhấn bên ngoài hộp thoại?


80

Tôi đang sử dụng a DialogFragment, và trong khi tôi đã đặt thành công một hình ảnh để đóng (tức là loại bỏ) hộp thoại khi được nhấn, tôi đang gặp khó khăn trong việc tìm cách loại bỏ hộp thoại khi người dùng nhấp vào bất kỳ đâu bên ngoài nó, giống như nó hoạt động với hộp thoại bình thường. Tôi nghĩ sẽ có một số loại

dialogFragment.setCanceledOnTouchOutside(true);

gọi, nhưng tôi không thấy điều đó trong tài liệu.

Điều này có thể với DialogFragmenttất cả? Hay tôi đang nhìn nhầm chỗ? Tôi đã thử chặn các sự kiện chạm trong hoạt động 'cha mẹ' nhưng ngoài việc không nhận được bất kỳ sự kiện chạm nào, nó có vẻ không phù hợp với tôi.

Câu trả lời:


177
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

Phải được gọi vào onCreateView(như Apurv Gupta đã chỉ ra).


34
Phải được gọi trongonCreateView
Apurv Gupta

Điều gì xảy ra nếu tôi không muốn nó hủy bỏ mà thay vào đó chỉ đóng lại?
jjxtra

58
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }

в моем случае getDialog (). setCanceledOnTouchOutside (true); не сработало, сработало getDialog (). gạt bỏ ();
Максим Фомичёв

@ МаксимФомичёв, в первом случае происходит установка свойства диалога, что его можноо закемавать унжи. Во втором случае вы сами программно закрываете диалог.
CoolMind

21
    /** The system calls this only when creating the layout in a dialog. */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }

điều này không hiệu quả với tôi. Tôi đã phải gọi setCanceledOnTouchOutsidetrong onCreateViewtheo @Apurv. Tôi nên đề cập rằng tôi đã gọisetCanceledOnTouchOutside(false)
kimbaudi

8

Có rất nhiều câu trả lời ở đây nhưng, ứng dụng bị lỗi khi hộp thoại mở ra. Viết getDialog().setCanceledOnTouchOutside(true);bên trong onCreateViewkhông hoạt động và làm ứng dụng của tôi bị hỏng.

(Tôi đang sử dụng AppCompatActivitylàm BaseActivity và android.app.DialogFragmentlàm Phân đoạn của tôi).

Những gì hoạt động là một trong hai dòng sau:

getDialog (). setCanceledOnTouchOutside (true);

HOẶC LÀ

this.getDialog (). setCanceledOnTouchOutside (true);

bên trong onActivityCreatednhư

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom;
        //getDialog().getWindow().setDimAmount(0.85f);
        getDialog().setCanceledOnTouchOutside(true);//See here is the code
    }

Những gì không sử dụng:

DialogFragment.getDialog (). SetCanceledOnTouchOutside (false);

ném lỗi sau

nhập mô tả hình ảnh ở đây

Và viết mã trong onCreateViewsự cố ứng dụng! Vui lòng cập nhật câu trả lời nếu bạn thấy điều gì đó sai.


Có thể điều này là do bạn tạo một hộp thoại bên trong onCreateDialog(), đây là cách khởi tạo thông thường. Trong trường hợp onCreateView()này không có gì và thậm chí không chứa một chế độ xem. Bạn có thể cố gắng chuyển mã sang onCreateDialog().
CoolMind

@CoolMind Ồ, đó là một quan sát hay. Chắc chắn sẽ giữ điều này trong danh sách thử của tôi. Cảm ơn!
sud007 19/04 '19

Tôi nghĩ, câu trả lời của bạn, tuy nhiên, rất hợp lý và 4 người được đánh dấu điểm cộng. Tôi cũng từng gặp vấn đề với onCreateDialog, onCreateViewtrong quá khứ gần đây. Có thể tôi sai, và bạn nên giữ lại onActivityCreated, đó là một phương pháp hay để thực hiện khởi tạo bổ sung ( ví dụ: xem stackoverflow.com/a/50734566/2914140 ).
CoolMind

@CoolMind hay và phù hợp với bạn. Nhưng tôi có thể nhận thấy rằng, các vấn đề mà bạn đang gặp phải là do cách BottomSheettriển khai của bạn . Nó có thể khác trong trường hợp BSheet mà tôi đồng ý. Nhưng giải pháp này cho một DialogFragmenthoạt động tốt.
sud007

3
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

Nó đã được gõ sai. Tôi đã từng gặp vấn đề tương tự. Điều này hoạt động tốt cho Java và Mono cho Android Mono sẽ là:

this.getDialog().SetCanceledOnTouchOutside(false);

Nhưng ai hỏi gì về Mono? : /
m0skit0

1
            Dialog.SetCanceledOnTouchOutside(true);

Làm việc cho tôi
Mã của tôi

class dlgRegister : DialogFragment
        {
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    ....
    ....
    }
    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
                Dialog.SetCanceledOnTouchOutside(true);
                base.OnActivityCreated(savedInstanceState);
                Dialog.Window.Attributes.WindowAnimations =    Resource.Style.dialog_animation;
            }
    }

1

Nếu bạn muốn thực thi một số logic khi nhấp vào bên ngoài a DialogFragment, chỉ cần ghi đè phương thức onCancel.

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // Do your work here
}

0

Tôi khuyên bạn chỉ nên sử dụng giải pháp của mình sau khi thử các giải pháp trên. Tôi đã mô tả giải pháp của tôi ở đây . Nói ngắn gọn, tôi đang kiểm tra giới hạn cảm ứng của DialogFragment.getView (). Khi các điểm tiếp xúc nằm ngoài DialogFragment, tôi đang loại bỏ Hộp thoại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.