2010-02-26 30 views
12

1) Tôi khởi động một tác vụ chạy nền (thông qua AsyncTask)Loại bỏ hộp thoại sau khi thay đổi hướng màn hình

new FindJourneyTask().execute(); // FindJourneyTask extends AsyncTask 

2) Vẫn trong các chủ đề chính (ngay trước khi chủ đề mới được tung ra) tôi có thể tạo một hộp thoại với ShowDialog (dialogId)

// this method is in FindJourneyTask 
protected void onPreExecute() { 
    showDialog(DIALOG_FINDING_JOURNEY); 
} 

3) thay đổi định hướng màn hình và các Hoạt động được tái

4) Làm thế nào tôi bây giờ có thể bỏ qua hộp thoại từ FindJourneyTask? Việc gọi hàm dismissDialog (dialogId) không làm gì cả.

// this method is in FindJourneyTask 
protected void onPostExecute(FindJourneyResult result) { 
    dismissDialog(DIALOG_FINDING_JOURNEY); // does nothing 
} 
+0

Đăng mã của bạn để chúng tôi có thể xem bạn đang làm gì sai. –

Trả lời

22

Đây là vấn đề phổ biến và không có giải pháp thực sự tốt. Vấn đề là thay đổi hướng màn hình, toàn bộ Hoạt động bị hủy và tái tạo. Đồng thời, Hộp thoại bạn đã tạo trước đó được tạo lại trong Hoạt động mới, nhưng tác vụ nền cũ vẫn đề cập đến Hoạt động cũ khi nó cố gắng loại bỏ hộp thoại. Kết quả là nó loại bỏ một hộp thoại đã bị hủy từ lâu, thay vì loại bỏ hộp thoại mà định hướng mới được tạo ra.

Có ba giải pháp cơ bản:

  1. Override mã định hướng xử lý mặc định để hoạt động của bạn không bị phá hủy khi quay. Đây có lẽ là câu trả lời thỏa đáng nhất, vì nó chặn rất nhiều mã được tự động chạy khi thay đổi định hướng.

  2. Tạo biến thành viên tĩnh của Hoạt động tham chiếu đến Hoạt động, do đó bạn có thể gọi STATIC_ACTIVITY_VARIABLE.dismissDialog().

  3. Mã một giải pháp trong đó tác vụ nền theo dõi Hoạt động hiện tại và tự cập nhật khi cần.

Ba giải pháp được thảo luận tại chiều dài ở đây: http://groups.google.com/group/android-developers/browse_thread/thread/bf046b95cf38832d/

+0

Tôi đã biến hộp thoại của mình thành biến tĩnh trong hoạt động của mình và nó hoạt động hoàn hảo ngay bây giờ. ví dụ. static AlertDialog dlg_error = null; – Kevin

10

Có một giải pháp tốt hơn cho vấn đề này ngay bây giờ trong đó bao gồm sử dụng mảnh vỡ.

Nếu bạn tạo hộp thoại bằng DialogFragment, thì đoạn này sẽ chịu trách nhiệm duy trì vòng đời của hộp thoại. Khi bạn hiển thị hộp thoại, bạn cung cấp thẻ cho đoạn của mình (DialogFragment.show()). Khi bạn cần truy cập hộp thoại của mình, bạn chỉ cần tìm DialogFragment cần thiết bằng cách sử dụng FragmentManager.findFragmentByTag thay vì có tham chiếu đến chính hộp thoại đó.

Bằng cách này nếu thiết bị thay đổi hướng, bạn sẽ nhận được một đoạn mới thay vì cũ, và mọi thứ sẽ hoạt động.

Dưới đây là một số mã cũng có trụ sở tại câu trả lời @peresisUser:

public void onSaveInstanceState(Bundle outState) { 
    AppCompatActivity activity = (AppCompatActivity) context; 
    FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
    DialogFragment dialogFragment = (DialogFragment) fragmentManager.findFragmentByTag("your_dialog_tag"); 
    if(dialogFragment!=null) { 
     Dialog dialog = dialogFragment.getDialog(); 
     if(dialog!=null && dialog.isShowing()) { 
     dialogFragment.dismiss(); 
     } 
    } 
} 
+1

Tôi nhận được cùng một vấn đề ngay cả khi sử dụng các đoạn. Khi hoạt động được tạo lại và cố gắng tìm mảnh bằng thẻ, tôi luôn nhận được tham chiếu rỗng với hộp thoại được hiển thị trong hoạt động mới O_o – fr4gus

+0

@ fr4gus Đây có thể là lỗi, bạn sẽ phải thử nghiệm với mọi thứ để tìm một cách giải quyết. – Malcolm

4

Đây là lâu sau khi câu hỏi đã được hỏi và trả lời, nhưng tôi stumbled khi vấn đề này cũng và muốn chia sẻ giải pháp của tôi ...

Tôi đăng ký trênSavedInstance() chạy trên thay đổi hướng, cho dù hộp thoại đang hiển thị hay không với dialog.isShowing() và chuyển nó vào biến outState. Sau đó, trong onCreate(), bạn kiểm tra var này nếu nó đúng. Nếu có, bạn chỉ cần bỏ qua hộp thoại của mình bằng hộp thoại.bỏ qua()

Hy vọng điều này sẽ giúp người khác:()

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