Tôi đang gặp vấn đề khá lớn và tôi không hoàn toàn hiểu những gì đang xảy ra. Tôi đang phát triển một ứng dụng có sử dụng Fragments (từ thư viện hỗ trợ) và đang sử dụng FragmentTransaction.replace()
để đặt Fragment mới vào stack phía sau và thay thế cái cũ. Mã trông như sau:Android Fragment View State Loss Khi sử dụng FragmentTransaction.replace()
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = ft.beginTransaction();
// Animations in my res/anim folder
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
Điều này thành công trong việc thay thế đoạn của tôi. Vấn đề của tôi là như sau. Trong một Fragment, tôi có một danh sách các mục được xây dựng từ đầu vào của người dùng. Bây giờ, khi người dùng nhấp vào tiếp theo và sau đó nhấp vào nút quay lại (để quay lại danh sách), danh sách sẽ trống vì chế độ xem bị hủy. Bây giờ, tôi đã lưu ý những điều sau đây:
- onSaveInstanceState không được gọi. Tôi tin rằng điều này là bởi vì điều đó chỉ được gọi khi hoạt động của phụ huynh nói với nó. Dựa trên các tài liệu: "Có nhiều tình huống mà một đoạn có thể bị rách nát (như khi được đặt trên ngăn xếp sau không hiển thị giao diện người dùng), nhưng trạng thái của nó sẽ không được lưu cho đến khi hoạt động sở hữu thực sự cần lưu trạng thái của nó ". Rõ ràng, thực hiện một thay thế trên FragmentTransaction không phải là một trong những lần đó. Có ai có xác nhận về điều này hoặc một lời giải thích tốt hơn?
- setOnRetainInstanceState (true) không hữu ích trong trường hợp này. Một lần nữa, tôi tin rằng điều này có liên quan đến thông tin từ các tài liệu: "Kiểm soát liệu một cá thể mảnh được giữ lại trong quá trình tạo lại Hoạt động (chẳng hạn như từ thay đổi cấu hình)". Tôi không thực hiện bất kỳ hành động nào trong việc tạo lại hoạt động để điều này không được sử dụng.
Vì vậy, tôi đoán câu hỏi chính của tôi là: có cách nào để bảo toàn trạng thái Chế độ xem (chỉ cần giữ lại Phân đoạn) khi sử dụng replace
? Có FragmentTransaction.add()
, nhưng có một vài vấn đề với điều này là tốt. Một là hoạt ảnh xuất cảnh không được thực hiện, do đó hoạt ảnh không chính xác. Một thứ khác nữa là mảnh vỡ mới mà đoạn cũ (cái đang được đưa vào trạng thái không nhìn thấy được) vẫn có thể nhấp được. Ví dụ, nếu tôi có một ListFragment, và tôi đặt một mảnh nội dung trên đầu trang đó bằng cách sử dụng add, tôi vẫn có thể nhấp vào các mục danh sách trong ListFragment.