まず、保持されているフラグメントに関する私の投稿を確認してください。それは役立つかもしれません。
今あなたの質問に答えるために:
フラグメントもそのビューステートを保持しますか、それとも構成の変更時にこれが再作成されますか?正確には「保持」されるものは何ですか?
はい、Fragment
の状態は構成の変更後も保持されます。具体的には、「保持」とは、構成の変更時にフラグメントが破棄されないことを意味します。つまり、構成の変更によって基になるものが破壊された場合でも、はFragment
保持されます。Activity
ユーザーがアクティビティを離れると、フラグメントは破棄されますか?
sと同様に、メモリリソースが少ない場合Activity
、Fragment
sはシステムによって破棄される可能性があります。フラグメントが構成を変更してもインスタンスの状態を保持するかどうかは、Fragment
を離れたときにシステムがを破棄するかどうかには影響しませんActivity
。Activity
(つまり、ホームボタンを押して)離れると、 Fragment
sは破棄される場合と破棄されない場合があります。Activity
戻るボタンを押してを離れると(つまり、を呼び出しfinish()
て効果的に破棄するとActivity
)、Activity
接続Fragment
されているすべてのが破棄されます。
バックスタックのフラグメントで機能しないのはなぜですか?
サポートされていない理由はおそらく複数ありますが、私にとって最も明白な理由は、Activity
がへの参照を保持し、FragmentManager
がFragmentManager
バックスタックを管理していることです。つまり、Fragment
sを保持することを選択したかどうかに関係なく、Activity
(したがってFragmentManager
'sバックスタック)は構成の変更時に破棄されます。それが機能しない可能性があるもう1つの理由は、保持されたフラグメントと保持されていないフラグメントの両方が同じバックスタックに存在することを許可された場合、物事がトリッキーになる可能性があるためです。
この方法を使用することが理にかなっているユースケースはどれですか?
保持されたフラグメントは、アクティビティインスタンス間で状態情報(特にスレッド管理)を伝播するのに非常に役立ちます。たとえば、フラグメントは、Thread
またはのインスタンスのホストとして機能し、AsyncTask
その操作を管理できます。詳細については、このトピックに関する私のブログ投稿を参照してください。
一般的に、私はそれを...で使用するonConfigurationChanged
のと同じように扱いActivity
ます...あなたが怠惰すぎて向きの変更を正しく実装/処理できないという理由だけでそれをバンドエイドとして使用しないでください。必要な場合にのみ使用してください。