各フラグメントで使用するsetRetainInstance(true)
と、問題が解消されます。
警告:これを true に設定すると、フラグメントのライフサイクルが変更されます。
問題は解決しsetRetainInstance(true)
ますが、使用したくない場合があります。これを修正するには、フラグメントにブール属性を設定し、可視性を復元します。
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);
}
}
構成が変更されると (画面の向きなど)、インスタンスは破棄されますが、バンドルは保存され、新しい Fragment インスタンスに挿入されます。