2012-12-18 25 views
14

Tôi có câu hỏi liên quan đến DialogFragment. Tôi đang cố gắng tạo một hộp thoại giữ trạng thái của nó sau khi thiết bị được xoay. Hộp thoại này có một loạt các tham chiếu đến những thứ như bộ điều hợp và các đối tượng nặng khác và tôi cần điều này được giữ khi xoay, nếu có thể mà không cần phải thực hiện mọi tham chiếu Parcelable hoặc Serializable để tôi sử dụng onSaveInstanceState để lưu và khôi phục chúng khi hoạt động ban đầu được tạo lại.DialogFragment with setRetainInstanceState (true) không được hiển thị sau khi thiết bị được xoay

Tôi đã nhận thấy có một phương pháp gọi là setRetainInstance (boolean) trên DialogFragment cho phép bạn giữ phiên bản phân đoạn hộp thoại khi hoạt động được tạo lại. Tuy nhiên, khi tôi xoay thiết bị ngay bây giờ, hộp thoại sẽ không hiển thị nữa. Tôi biết tôi có thể lấy nó từ FragmentManager của hoạt động, nhưng tôi không thể tìm thấy một cách để làm cho nó có thể nhìn thấy một lần nữa. Bất kỳ đề xuất về điều này?

Cảm ơn, Mihai

+1

Có lẽ điều này có thể giúp: http://stackoverflow.com/questions/8235080/fragments-dialogfragment-and-screen-rotation –

+0

Tôi thấy vấn đề khái niệm lớn hơn nhiều ở đây. Trong tài liệu android cho setFragmentInstance, nó được viết rằng "Kiểm soát liệu một thể hiện phân đoạn có được giữ lại trong Hoạt động tạo lại (chẳng hạn như từ thay đổi cấu hình). Chỉ có thể sử dụng nó với các đoạn ** không nằm trong ngăn xếp sau **. thiết lập, vòng đời của đoạn sẽ hơi khác khi một hoạt động được tạo lại ". Có phải điều này là do thực tế là đoạn hộp thoại nằm trong hậu trường? – Swapnil

Trả lời

21

Có vài điều bạn cần làm:

  1. sử dụng phương pháp nhà máy dụ để bắt đầu một trường hợp DialogFragment như thế này:

    public static MyDialogFragment newInstance(MyModel model) { 
        MyDialogFragment myDialogFragment = new MyDialogFragment(); 
        Bundle bundle = new Bundle(); 
        bundle.putSerializable("MODEL", model); 
        myDialogFragment .setArguments(bundle); 
        return myDialogFragment; 
    } 
    
  2. bằng cách đặt setRetainInstance (true) trong onCreate, tất cả các tham chiếu của bạn được khai báo trong đoạn sẽ được giữ lại sau khi hoạt động ban đầu được tạo lại

    @Override 
    public void onCreate(Bundle icicle) { 
        this.setCancelable(true); 
        setRetainInstance(true); 
        super.onCreate(icicle); 
    
    } 
    
  3. tránh biến mất trên xoay bằng cách làm này

    @Override 
    public void onDestroyView() { 
        if (getDialog() != null && getRetainInstance()) 
         getDialog().setDismissMessage(null); 
        super.onDestroyView(); 
    

    }

  4. được đối tượng của bạn bằng cách sử dụng

    (MyModel) getArguments().getSerializable("MODEL") 
    
+0

Cảm ơn câu trả lời @ ricky888, nhưng vì tôi đang tạo một đoạn hộp thoại và truyền nội dung trong hàm tạo của đoạn hộp thoại, chẳng hạn như bộ điều hợp danh sách và dữ liệu nặng khác, tôi muốn tránh việc tuần tự hóa và tôi đã nghĩ đến việc sử dụng bộ giữ thể hiện trạng thái sao cho đoạn hộp thoại không được tạo lại khi xoay. Vì vậy, tôi nghĩ rằng bằng cách sử dụng thiết lập trạng thái thể hiện, tôi sẽ có cùng một đoạn hộp thoại như trước khi xoay - có nghĩa là đoạn hộp thoại không được tạo lại với hoạt động và các đoạn của nó khi xoay. Đây có phải là trường hợp không? – r1k0

+0

setRetainInstance - Kiểm soát xem một cá thể phân đoạn có được giữ lại trong quá trình tạo lại Hoạt động hay không (chẳng hạn như từ thay đổi cấu hình). Vì vậy, câu trả lời là có. Bạn sẽ giữ cùng một ví dụ của tất cả các chất liệu của bạn trên vòng xoay bằng cách đặt chúng trong gói giống như tôi đã đề cập ở trên. – ricky888

+0

Thật vậy, câu trả lời đúng sẽ liên quan đến việc tuần tự hóa, vì vậy chúng tôi đã thiết kế lại phân đoạn để có ít dữ liệu hơn để có thể duy trì trạng thái khi thay đổi cấu hình, như được đề xuất bởi @ ricky888 – r1k0

0

Đoạn thoại cần được bảo tồn tự động miễn là bạn làm như sau:

  1. Nếu bạn gọi một hoạt động onSaveInstanceState(), đảm bảo bạn gọi chức năng siêu !!!!. Trong trường hợp của tôi, đó là chìa khóa. Ngoài ra hãy chắc chắn bạn làm điều tương tự trong Fragment.
  2. Nếu bạn sử dụng setRetainInstance, bạn cần phải lưu trữ các giá trị theo cách thủ công. Nếu không, bạn sẽ không thể lo lắng về nó, trong hầu hết các trường hợp. Nếu bạn đang làm một cái gì đó phức tạp hơn một chút, bạn có thể cần phải setRetainInstance(true), nhưng nếu không thì hãy bỏ qua nó.
  3. Một số người đã phàn nàn về một lỗi trong thư viện hỗ trợ, trong đó một tin nhắn loại bỏ được gửi khi nó không được. Thư viện hỗ trợ mới nhất dường như đã sửa lỗi đó, vì vậy bạn không cần phải lo lắng về điều đó.
+2

Giới thiệu về # 2, tôi nghĩ bạn có nghĩa là " nếu bạn không sử dụng setRetainInstance ... "ở đầu câu, bởi vì nếu không bạn sẽ phải lưu trữ và khôi phục các giá trị. –

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