更新された回答:
トラブルが発生する可能性のあるシナリオは何ですか?
Fragmentバックスタックにaを追加し、構成変更時BundleにFragmentfromからonSaveInstanceState()toに渡す場合。onCreateView()呼び出しsetRetainInstance(true)は、構成のBundle変更時にをnullに設定します。
setRetainInstance(true)(使用すると冗長になるため、開発者が実際にこれを試みるかどうかonSaveInstanceState()はわかりませんが、APIドキュメントに記載されている動作が見られなかったため、この回答を作成しました)。
addToBackStack()との両方setRetainInstance(true)が呼び出された場合、のみを呼び出す場合と比較して、構成変更時にライフサイクルメソッドの呼び出しとパラメーター値がsetRetainInstance()部分的に変更されます。FragmentaddToBackStack()
addToBackStack()具体的には、以下のテストで、呼び出しのみと呼び出しの違いを調べ、setRetainInstance(true)構成の変更で何が起こるかを確認します。
呼び出しますaddToBackStack()が、しませんsetRetainInstance(true);
onCreate()とonDestroy()呼ばれます。
- から渡されたバンドルは
onSaveInstanceState()、のパラメータとして受信されますonCreateView()。
addToBackStack()との両方を呼び出すsetRetainInstance(true):
onCreate()とonDestroy()は呼ばれません。これは、APIドキュメントで説明されています。
- から渡されたバンドル
onSaveInstanceState()はで受信されませんonCreateView()。渡されたBundleものはnullです。
ログに記録されたメソッド呼び出しとnullについてテストされたパラメーターを使用したテスト:
でActivity:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyFragment fragment;
if (savedInstanceState != null) {
fragment = (MyFragment) getFragmentManager().findFragmentByTag("my_fragment_tag");
} else {
fragment = new MyFragment();
FragmentTransaction t = getFragmentManager().beginTransaction();
t.addToBackStack(null);//toggle this
t.add(android.R.id.content, fragment, "my_fragment_tag").commit();
}
}
でFragment:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);//toggle this
}
と
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("test", "value");
super.onSaveInstanceState(outState);
}
テスト1:呼び出されたときaddToBackStack()と呼び出されなかっsetRetainInstance(true)たときのフラグメントライフサイクル
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
[デバイスを縦向きから横向きに回転]
- onPause()
- onSaveInstanceState()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
- onAttach()
- onCreate()
- onCreateView()with bundle param!= null
- onStart()
- onResume()
テスト2および3:呼び出されたsetRetainInstance(true)、addToBackStack()呼び出された/呼び出されなかった(同じ結果)を使用したフラグメントライフサイクル呼び出し:
- onAttach()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
[デバイスを縦向きから横向きに回転]
- onPause()
- onSaveInstanceState()
- onStop()
- onDestroyView()
- onDetach()
- onAttach()
- onCreateView()with bundle param == null
- onStart()
- onResume()