22

Chúng tôi đang sử dụng Phân đoạn và chúng tôi không cần chúng được khôi phục tự động khi Hoạt động được tạo lại. Nhưng Android mỗi lần khi số điện thoại Activity::onCreate(Bundle savedInstanceState) ->super.onCreate(savedInstanceState) được gọi, hãy khôi phục Phân đoạn ngay cả khi chúng tôi sử dụng setRetainInstance (false) cho các Phân đoạn đó.Ngăn chặn phục hồi Fragment trong Android

Hơn nữa, trong những FragmentsFragment.performCreateView() này được gọi trực tiếp mà không qua Fragment::onAttach() v.v. Ngoài ra, một số trường trống bên trong được khôi phục Fragment ...

Có ai biết cách ngăn Android khôi phục các đoạn không?

P.S. Chúng ta biết rằng trong trường hợp tái tạo Activity để cấu hình các thay đổi, nó có thể được thực hiện bằng cách thêm vào biểu hiện một ndroid:configChanges="orientation|screenSize|screenLayout. Nhưng những gì về tái tạo hoạt động trong trường hợp làm sạch bộ nhớ tự động?

Trả lời

36

Chúng tôi đã hoàn thành bằng cách thêm vào hoạt động:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(null); 
} 

Nó ngăn chặn bất kỳ dữ liệu lưu trên tạo/tái tạo chu kỳ của một hoạt động và tránh mảnh vỡ tự động tái tạo.

+1

Đơn giản nhưng rất hiệu quả. Điều này thực sự lưu ass của tôi với một thiết kế xấu hiện tại (1 Activity App + 1 Fragment cho mỗi màn hình). – momo

+0

Nếu đoạn có một số giao diện người dùng thì bạn không nghĩ đó là trải nghiệm người dùng tồi. –

+2

Điều này làm việc như một say mê, nhưng tôi thực sự hy vọng có một cách sạch hơn để làm điều này ... – jenzz

-1

Xem cấu trúc phân cấp không được khôi phục tự động. Vì vậy, trong Fragment.onCreateView() hoặc Activity.onCreate(), bạn phải khôi phục tất cả các chế độ xem (từ xml hoặc theo chương trình). Mỗi ViewGroup chứa một đoạn, phải có cùng một ID như khi bạn tạo nó lần đầu tiên. Khi phân cấp khung nhìn được tạo, Android sẽ khôi phục tất cả các phân đoạn và đặt chế độ xem của chúng trong ViewGroup phù hợp nhờ vào ID. Giả sử rằng Android nhớ ID của ViewGroup mà trên đó một đoạn là. Điều này xảy ra ở đâu đó giữa onCreateView()onStart().

+4

Thật không may, nó được khôi phục tự động ... – goRGon

0

Tôi đã xóa các đoạn trong Activity onCreate.

7

@goRGon của câu trả lời là rất hữu ích cho tôi, nhưng việc sử dụng như vậy gây ra vấn đề nghiêm trọng khi có thêm một số thông tin bạn cần để chuyển tiếp đến hoạt động của bạn sau khi tái tạo.

Đây là phiên bản cải tiến chỉ xóa "phân đoạn", nhưng giữ mọi thông số khác.

ID bị xóa khỏi gói là một phần của lớp android.support.v4.app.FragmentActivity là trường FRAGMENTS_TAG. Nó có thể tất nhiên thay đổi theo thời gian, nhưng nó không được mong đợi.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(createBundleNoFragmentRestore(savedInstanceState)); 
} 

/** 
* Improve bundle to prevent restoring of fragments. 
* @param bundle bundle container 
* @return improved bundle with removed "fragments parcelable" 
*/ 
private static Bundle createBundleNoFragmentRestore(Bundle bundle) { 
    if (bundle != null) { 
     bundle.remove("android:support:fragments"); 
    } 
    return bundle; 
} 
+0

tuyệt vời. Chính xác những gì tôi đang tìm kiếm – Bolein95

1

Những người đã NPE với ViewPager khi sử dụng phương pháp này được mô tả trong các câu trả lời được chấp nhận, xin vui lòng ghi đè phương pháp

ViewPager.onRestoreInstanceState(Parcelable state)

và gọi

super.onRestoreInstanceState(null);

để thay thế.

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