更新された回答:
トラブルが発生する可能性のあるシナリオは何ですか?
Fragment
バックスタックにaを追加し、構成変更時Bundle
にFragment
fromからonSaveInstanceState()
toに渡す場合。onCreateView()
呼び出しsetRetainInstance(true)
は、構成のBundle
変更時にをnullに設定します。
setRetainInstance(true)
(使用すると冗長になるため、開発者が実際にこれを試みるかどうかonSaveInstanceState()
はわかりませんが、APIドキュメントに記載されている動作が見られなかったため、この回答を作成しました)。
addToBackStack()
との両方setRetainInstance(true)
が呼び出された場合、のみを呼び出す場合と比較して、構成変更時にライフサイクルメソッドの呼び出しとパラメーター値がsetRetainInstance()
部分的に変更されます。Fragment
addToBackStack()
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()