2012-10-24 37 views
5

Tôi có Hoạt động và cần hiển thị Hộp thoại trong đó. Mọi thứ đều hoạt động tốt ở đây. Tôi đã overrided onCreateDialog phương pháp trong hoạt động, đây là mã:Hộp thoại Android hiển thị lại sau khi Hoạt động được tạo lại

đâu CreateWaitDialog là phương pháp tùy chỉnh của việc tạo ra một hộp thoại và waitDialog là tĩnh biến.

Tôi đang hiển thị hộp thoại bằng cách gọi cho showDialog (10)

Tất cả mã đang hoạt động tốt.

Sau khi hộp thoại được hiển thị, tôi sẽ đóng hộp thoại bằng cách gọi.

if(waitDialog != null) 
    waitDialog.hide(); 

Và tôi sẽ loại bỏ nó khi Hoạt động bị hủy.

if(dialogCreated) 
     dismissDialog(10); 
    super.onDestroy(); 

Kết thúc và mọi thứ đều tuyệt vời. NHƯNG, khi tôi thay đổi hướng của thiết bị và Hoạt động được tạo lại, nó tự bật lên một lần nữa! Tôi không gọi bất kỳ showDialog hoặc một cái gì đó như thế nó chỉ là popping up!

Trả lời

8

Tôi nghĩ rằng đây được xác định hành vi của các hoạt động và onCreateDialog:

Callback để tạo các hộp thoại được quản lý (lưu và phục hồi) cho bạn bởi hoạt động này. Việc thực thi mặc định gọi đến onCreateDialog (int) để tương thích. Nếu bạn đang nhắm mục tiêu HONEYCOMB trở lên, hãy xem xét thay vì sử dụng DialogFragment để thay thế.

Nếu bạn sử dụng showDialog (int), hoạt động sẽ gọi đến phương thức này lần đầu tiên và treo vào nó sau đó. Bất kỳ hộp thoại nào được tạo bằng phương pháp này sẽ tự động được lưu và khôi phục cho bạn, bao gồm cả hộp thoại đang hiển thị hay không.

Nếu bạn muốn hoạt động quản lý lưu và khôi phục hộp thoại cho bạn, bạn nên ghi đè phương pháp này và xử lý bất kỳ id nào được chuyển tới showDialog (int).

Tôi đoán rằng onDestroy đã quá muộn trong vòng đời hoạt động để loại bỏ hộp thoại. Tôi đoán là Activity đang lưu hộp thoại của bạn bên trong onSaveInstanceState.

Tôi có thể thử loại bỏ hộp thoại bên trong onSaveInstanceState trước khi gọi super.onSaveInstanceState, sau đó hộp thoại sẽ bị loại bỏ trước khi Android cố lưu và khôi phục hộp thoại.

@Override 
onSaveInstanceState(Bundle outstate) { 

    dismissDialog(10); 
    super.onSaveInstanceState(outstate); 
} 
+1

Tôi ghét các câu trả lời cạnh tranh vì bạn đã dành thêm thời gian để trích dẫn tài liệu, tôi đã xóa câu trả lời của mình và cung cấp cho bạn một ý kiến ​​mới. – Sam

+0

@Sam Tôi nghĩ câu trả lời của bạn vẫn có giá trị, tôi sẽ rời khỏi nó.Có lẽ anh ta thực sự nên gọi là sa thải thay vì trốn, câu trả lời của tôi chỉ đơn thuần là phỏng đoán/hack để có được hành vi mặc định của onCreateDialog. Tôi nghĩ rằng bạn có lẽ là giải pháp tốt hơn. – Tim

+0

Tôi chỉ kiểm tra lại mã nguồn và nếu hộp thoại được hiển thị nhiều lần, sử dụng 'hide()' là cách tiếp cận nhanh hơn. Ngoài ra câu trả lời của bạn có thể đã được đoán, nhưng nó cũng được thành lập và chính xác. Vì vậy, tôi vui mừng để lại upvote của tôi. – Sam

1

Gọi Activity.removeDialog (int id) nếu bạn muốn ngăn ứng dụng tiếp tục lưu và khôi phục hộp thoại của mình.

4

Tôi thấy mình có vấn đề tương tự xảy ra vì tôi đã override onDismiss() mà không gọi super.onDismiss(). Nếu bạn thấy mình có các hộp thoại xuất hiện lại khi một hoạt động được tạo lại, bạn có thể muốn xác minh rằng bạn đã không phạm sai lầm tương tự.

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