フラグメントは、今後の方法として Android 開発チームによってプッシュされています。それらの導入の理由は、ここでは説明しませんが、Web 上のさまざまな場所に文書化されています。それらを導入した理由の 1 つは、開発者がアプリケーションの特定の機能を (ほぼ) スタンドアロン モジュールにカプセル化し、必要に応じてロードおよびアンロードできるようにし、Android プラットフォームで利用できる幅広いデバイス画面を最大限に活用できるようにすることです。
残念ながら (私の謙虚な意見では) 不注意な開発者 (私もその 1 人) を捕まえる可能性のある Fragments にはいくつかの微妙な点があります。私は Fragments の権威であると主張することはできませんが、それらを使用して発見したことを伝えることができます。だからあなたの質問に答えるために:
attach()/detach()
手作業で断片化する必要がある場合、厳密なルールはないと思います。ただし、フラグメントを別のフラグメントに置き換えるのではなく、切り離したい場合があります。ただし、ドキュメントに記載されているように、これはフラグメントを破壊しないことに注意してください
指定されたフラグメントを UI から切り離します。これは、バック スタックに配置されたときと同じ状態です。フラグメントは UI から削除されますが、その状態はまだフラグメント マネージャーによってアクティブに管理されています。この状態になると、そのビュー階層は破棄されます。
Fragment オブジェクトは破棄されますが、要素 (存在する場合) は表示されます。Fragment が再接続されattach()
、View 階層が再作成されると ( docs ):
以前に detach(Fragment) を使用して UI から切り離されたフラグメントを再度付加します。これにより、そのビュー階層が再作成され、UI にアタッチされ、表示されます。
これは、バックグラウンドの Fragment が View 階層を更新する必要がある場合、View に戻ったときにすぐに更新されるため、特に役に立ちません。最終結果は、フラグメントの「醜い」再描画を取得することです。私が言いたいのは、それがあなたのアプリに、はるかに望ましい洗練された「すぐに使える」空気ではなく、急いでプロらしくない再描画の外観を与えるという意味で醜いということです.
最新の Fragment UI を維持することが重要である場合、この再描画を回避する方法があります。フラグメントをアタッチおよびデタッチする代わりに、単にshow()およびhide()することができます。これにより、View 階層の再作成が回避されますが、Fragment が非表示になっている間、View 内で何も再描画されないように注意する必要があります。これにより、例外が発生します(私が思うに、これをいじってからしばらく経ちました)。
Fragments を手動でアタッチおよびデタッチしても問題はありません。おそらく、これらのメソッドは、そのようなことを行う必要がある場合に備えて、Android 開発者によって提供されていると考える必要があります。replace()
その上、とにかく、これらのより「アトミックな」メソッドへの呼び出しをイメージします。
フラグメントが破棄される限り、アプリを閉じると明らかに破棄されますが、それ以外の場合は、通常のガベージ ルーチンに陥るだけだと思います (ただし、引用しないでください!)。つまり、オブジェクトへの参照がない場合、破棄のマークが付けられます。