Sử dụng setRetainInstance(true)
trên mỗi đoạn và vấn đề của bạn sẽ biến mất.
Cảnh báo: đặt điều này thành đúng sẽ thay đổi vòng đời Fragments.
Trong khi setRetainInstance(true)
giải quyết sự cố, có thể có những trường hợp bạn không muốn sử dụng. Để khắc phục điều đó, thiết lập một thuộc tính boolean trên Fragment và khôi phục khả năng hiển thị:
private boolean mVisible = true;
@Override
public void onCreate(Bundle _savedInstanceState) {
super.onCreate(_savedInstanceState);
if (_savedInstanceState!=null) {
mVisible = _savedInstanceState.getBoolean("mVisible");
}
if (!mVisible) {
getFragmentManager().beginTransaction().hide(this).commit();
}
// Hey! no setRetainInstance(true) used here.
}
@Override
public void onHiddenChanged(boolean _hidden) {
super.onHiddenChanged(_hidden);
mVisible = !_hidden;
}
@Override
public void onSaveInstanceState(Bundle _outState) {
super.onSaveInstanceState(_outState);
if (_outState!=null) {
_outState.putBoolean("mVisible", mVisible);
}
}
Khi thay đổi cấu hình (ví dụ như hướng màn hình), các trường hợp sẽ bị phá hủy, nhưng Bundle sẽ được lưu trữ và tiêm vào ví dụ Fragment mới.
Chỉ cần lưu ý, mảnh vỡ ẩn đã được lưu giữ trong các thùng chứa như vô hình. Vì vậy, việc thay đổi cấu hình có thể hiển thị lại chúng vì chúng đã ở đó. – zgulser