2012-06-26 27 views
79

Các tài liệu nói điều này đối với phương pháp dismiss() từ lớp Dialog:Cách loại bỏ một DialogFragment chính xác?

Dismiss this dialog, removing it from the screen. This method can be invoked 
safely from any thread. Note that you should not override this method to do 
cleanup when the dialog is dismissed, instead implement that in onStop(). 

Trong mã của tôi, tất cả tôi làm là gọi getDialog().dismiss() để bỏ qua nó. Nhưng tôi không làm bất cứ điều gì khác hoặc thậm chí sử dụng onStop(). Vì vậy, tôi hỏi chính xác cách loại bỏ một cách chính xác DialogFragment để tránh rò rỉ bộ nhớ, vv ..

Trả lời

136

tl; dr: Cách đúng để đóng một DialogFragment là sử dụng dismiss()trực tiếp trên DialogFragment.


Chi tiết: Các documentation of DialogFragment bang

kiểm soát của hộp thoại (quyết định thời gian hiển thị, ẩn, bỏ qua nó) nên được thực hiện thông qua các API ở đây, không phải với các cuộc gọi trực tiếp trên hộp thoại .

Vì vậy, bạn không nên sử dụng getDialog().dismiss(), vì đó sẽ gọi dismiss()trên hộp thoại. Thay vào đó, bạn nên sử dụng phương pháp dismiss() của DialogFragment bản thân:

public void bỏ()

Loại bỏ đoạn và hộp thoại của nó. Nếu đoạn đã được thêm vào ngăn xếp trở lại, tất cả trạng thái ngăn xếp lại lên đến và bao gồm mục nhập này sẽ xuất hiện. Nếu không, một giao dịch mới sẽ được cam kết loại bỏ đoạn.

Như bạn có thể thấy, điều này không chỉ quan tâm đến việc đóng hộp thoại mà còn xử lý các giao dịch phân đoạn liên quan đến quy trình.

Bạn chỉ cần sử dụng onStop nếu bạn đã tạo rõ ràng mọi tài nguyên yêu cầu dọn dẹp thủ công (đóng tệp, đóng con trỏ, v.v.). Thậm chí sau đó, tôi sẽ ghi đè onStop của hộp thoại DialogFragment thay vì onStop của Hộp thoại cơ bản.

+4

Thật không may điều này gây ra Hoạt động có chứa của tôi để kết thúc ... –

+0

@ScootrNova: Nó không nên, bạn có thể có một lỗi ở nơi khác. Bạn tạo ra phân đoạn như thế nào? – Heinzi

+0

'protected void showDialogFragment (final DialogFragment fragment) {final FragmentTransaction fTransaction = getSupportFragmentManager(). StartsTransaction(); fTransaction.addToBackStack (null); fragment.show (fTransaction, "dialog");} ' Xin lỗi vì một lớp lót khó chịu! Nhưng yeah bạn có thể đúng, vì vậy trong thời gian này tôi đã viết lên một cách khác để đóng DialogFragments của tôi. Cách mà tôi đã loại bỏ chúng bằng cách sử dụng phương thức dismiss() chỉ là tìm phân đoạn bằng thẻ và sau đó chạy bỏ qua() trên thẻ nếu nó không phải là rỗng. Ồ, vâng, tôi đang "mới" chia mảnh ngay trước khi chuyển nó cho phương pháp đó. –

0

Bạn nên bỏ qua bạn Dialog trong onPause() để ghi đè lên.

Ngoài ra trước khi sa thải bạn có thể kiểm tra null và được thể hiện như dưới đây đoạn mã:

@Override 
protected void onPause() { 
    super.onPause(); 
    if (dialog != null && dialog.isShowing()) { 
     dialog.dismiss(); 
    } 
} 
+0

anh ấy đã viết rằng anh ấy đang loại bỏ() và về DialogFragment của nó. –

+0

Tôi nghĩ rằng điều này làm việc cho cả Dialog và DialogFragments @PareshMayani – Venky

+2

Tôi tin rằng @PareshMayani là đúng Venky. Hướng dẫn về 'DialogFragment' của google không hiển thị phương thức' onPause() 'đang được sử dụng. Nhưng tôi nghĩ rằng tôi thấy những gì bạn đang làm. Whats điểm mặc dù nếu người dùng không gọi là 'onPause() '. Thats khi hệ thống biết mảnh vỡ đang được gọi đi. Điều gì về khi nào, nói một người dùng hủy bỏ. Whats cách nào tốt hơn để đóng nó trong trường hợp đó? – Andy

48

Tôi nghĩ rằng một cách tốt hơn để đóng một DialogFragment là thế này:

Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog"); 
    if (prev != null) { 
     DialogFragment df = (DialogFragment) prev; 
     df.dismiss(); 
    } 

Bằng cách này bạn không cần phải giữ một tham chiếu đến DialogFragment và có thể đóng nó từ khắp mọi nơi.

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