2011-12-14 30 views
56

Tôi đang cố gắng lưu dữ liệu trong phần onSaveInstanceState() của Fragment, nhưng phương thức này không bao giờ được gọi.onSaveInstanceState của Fragment() không bao giờ được gọi là

Ai đó có thể trợ giúp?

public class MyFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ScrollView content = (ScrollView) inflater.inflate(R.layout.content, container, false); 
     // More stuff 
     return content; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle icicle) { 
     // NEVER CALLED 
     super.onSaveInstanceState(icicle); 
     //More stuff 
    } 

} 
+0

bạn có đang sử dụng sherlock của thanh tác vụ không? Tôi chỉ cần kiểm tra để đảm bảo rằng tôi đã có gói hỗ trợ mới nhất, và nhận ra tôi đang sử dụng sherlock actionbar. Tôi đã cập nhật lên ABS mới nhất, nhưng tôi vẫn gặp sự cố. Bạn không chắc liệu ABS có phải là thủ phạm không? – James

+1

Tôi vừa thử dùng công cụ Mark4's EU4You (https://github.com/commonsguy/cw-android/tree/master/Fragments/EU4You_6) với thư viện hỗ trợ bình thường và cũng với ActionBarSherlock. Nó được gọi là onSaveInstanceState và đã chuyển gói thành onActivityCreated như mong đợi trong cả hai trường hợp. Vì vậy, vẫn cần phải id nguyên nhân của việc này. – James

Trả lời

67

Cuối cùng tôi đã tìm ra được vấn đề, ít nhất là trong trường hợp của tôi. Tôi đã bị ghi đè onSaveInstanceState trong FragmentActivity của tôi mà không gọi super.onSaveInstanceState(Bundle outState). Khi tôi đã thêm vào đó, các Fragment.onSaveInstanceState(Bundle outState) hoạt động bình thường.

+7

Hehehe ... và đó là một lỗi trong EU4You_6 quá. Cảm ơn bạn đã đăng bài này! – CommonsWare

+0

xin lỗi, tôi thấy câu trả lời này là đúng nhưng bạn có thể giải thích thêm về câu trả lời này, tôi đang đối mặt với vấn đề này quá, cảm ơn nhiều – famfamfam

-5

Hãy thử gọi setRetainInstance(true) trong onCreate(Bundle savedInstanceState).

+0

Không hoạt động: (.Tôi sẽ sử dụng SharedPreferences ... Cảm ơn anyway – jul

+1

Khi nào bạn mong đợi 'onSaveInstanceState' được gọi? Có lẽ bạn chỉ không kích hoạt nó ngay. – Felix

+0

Tôi hy vọng nó sẽ được gọi khi rời khỏi Hoạt động để lưu một số dữ liệu khi quay trở lại với nó.Đó là đúng không? – jul

6

Một điều cần kiểm tra là đảm bảo Hoạt động chứa phân đoạn không ngăn cản khởi động lại bằng cách đưa cờ android:configChanges vào tệp AndroidManifest.xml.

+0

Tại sao có liên quan? –

+1

có người đàn ông, bạn giải quyết vấn đề của tôi :) – Laurent

21

Tôi đã gặp cùng câu hỏi với bạn và đã thử phương thức onSaveInstanceState() nhưng không hoạt động.

Tôi nghĩ onSaveInstanceState() chỉ hoạt động cho các kịch bản mà người dùng nhảy từ một hoạt động để hoạt động khác và ngược lại, nó không hoạt động trong kịch bản mà người dùng nhảy giữa các mảnh vỡ trong hoạt động tương tự.

đây là tài liệu hướng dẫn từ Google. http://developer.android.com/guide/components/tasks-and-back-stack.html#ActivityState

+3

đó là sự thật. Fragment.onSaveInstanceState sẽ không được gọi cho đến khi hoạt động lưu trữ nó cần phải lưu trạng thái của nó như đã nêu ở đây: http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle) – saulobrito

+2

Sau đó, tôi nên làm gì nếu tôi muốn lưu dữ liệu trong đoạn hiện tại? – benleung

+1

@benleung, tôi muốn sử dụng một đối tượng có vòng đời độc lập so với đoạn để lưu dữ liệu.Ví dụ, một trình quản lý dữ liệu đơn lẻ, một dịch vụ dính, hoặc thậm chí là SharedPreferences hoặc một Tệp, hai cái cuối cùng có thể không phải là lựa chọn tốt nhất do phí trên. – Zephyr

4

Trong một số trường hợp, bạn có thể thấy hữu ích khi sử dụng đối số phân đoạn thay vì savedInstanceState. Further explanation.

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