2016-11-08 7 views
3

docsFragmentTransactionをコミットするのはいつ安全ですか?

フラグメントトランザクションによるだけ前にその状態を保存 活動にコミット/作成することができます。あなたは Activity.onSaveInstanceState()(前次 Activity.onStartまたはActivity.onResume(へ)後にトランザクションをコミットしようとすると、エラーが発生します。

私は、最初の部分ということを理解することができますアクティビティを復元する必要がある場合、コミット後の状態が失われる可能性があるため、Activity.onSaveInstanceState()、 の後にフラグメントトランザクションをコミットすることはできません。

しかし、私はなぜコミットできないのかわかりませんActivity.onStartまたはActivity.onResume()?Oncreate()はActivity.onStartまたはActivity.onResume()の前にも存在します。これは、oncでコミットできないことを意味しますかreate()?ここ

答えて

3

キーを使用すると、前次onStart()またはonResume()からonSaveInstanceState()に呼び出しの後、トランザクションをコミットすることができないということです。

最初にonCreate()、その後にonStart()またはonResume()の状態がないため、トランザクションを正常にコミットできます。

アクティビティが元の状態に戻っている場合(つまり、以前にが呼び出され、その状態でアクティビティが再作成されている場合は、フラグメントトランザクションを実行できません。以前のFragment状態を復元すると、現在の状態が不明確な状態になります。保存された状態は、Fragmentトランザクションをコミットして作成した新しい状態よりも優先されますか、または新しいトランザクションが優先される保存された状態?

このシナリオを確認する最も簡単な方法は、onCreate()およびその他のライフサイクルメソッドに渡されたsavedInstanceStateバンドルがnullかどうかを確認することです。再保存された状態ではなく、あなたのトランザクションを安全に実行することができます。それがヌルでない場合は、保存する可能性が高い保存済み状態があります。

+0


これはという扱い? savedInstanceStateバンドルがonCreate()に渡されたとき、状態はまだ復元されていませんか? onCreate()またはonRestoreInstanceStateで状態を調べることができます。 – user3591494

+0

アクティビティが作成されたばかりなので、状態は 'onCreate()'にまだ復元されていません。たとえば、まだコンテンツビューを作成/設定していないので、保存されたビューはどこにもありません。必要ならばあなたの*アプリケーションの状態を 'onCreate()'で復元することができますが、他のすべてのコンポーネントの状態の復元が完了したわけではありません。 –

+0

OnCreate()が完了したときにsetContentView()がまだ実行されていて、onResume()の実行が開始されるまで実行されますか? – user3591494

1

それは本質的にonPause()/onResume()前意味onSaveInstanceState()前の任意の時間、安全だし、あなたの活動は、これまでonPause()に行った場合、それが唯一のonResume()後に安全です。

たとえば、onActivityResult()の間に、実際にonResume()以降に行っていないので、onActivityResult()でダイアログを開くとクラッシュする可能性があります。

0

コミットトランザクションがを実行していない可能性がある心に留めすることがあります。 )は、状態がのonCreate(でありません、なぜ私は理解していない

getSupportFragmentManager().executePendingTransactions(); 
関連する問題