web-dev-qa-db-ja.com

FragmentTransactionのattachおよびdetachメソッドを使用する場合

FragmentTransactionattach()メソッドとdetach()メソッドのドキュメントを調べたところです。

attach()detach(Fragment)を使用してUIから以前にデタッチしたフラグメントを再アタッチします。これにより、ビュー階層が再作成され、UIにアタッチされて表示されます。

さて、それはどういう意味ですか?

  1. 具体的には、例を見ました:

    _mMapFragment = new MapFragment();
    ft.beginTransaction(mMapFragment)
      .attach()
      .add(R.id.container, mMapFragment)
      .commit();
    _

    attach()を削除して再試行しました。違いに気付きませんでした。この例でattachは何をしますか?これと比較した違いは何ですか:

    _ft.beginTransaction()
      .add(R.id.container, mMapFragment)
      .commit();
    _
  2. 上記の例では違いを示すのに十分ではない場合... attach()detach()を明示的に呼び出す必要があるのはいつなのか知りたいだけです。追加/削除/置換に関する違いを説明できるとよいでしょう。

31
GingerJim

何が起こっているのかを理解するには、 FragmentTransaction Documentation のDetach and Removeの定義を見ることをお勧めします。

切り離す

UIから特定のフラグメントをデタッチします。これは、バックスタックに置かれたときと同じ状態です。フラグメントはUIから削除されますが、その状態はまだフラグメントマネージャーによってアクティブに管理されています。この状態になると、そのビュー階層は破棄されます。

削除する

既存のフラグメントを削除します。コンテナに追加された場合、そのビューもそのコンテナから削除されます。

その意味は:

detachingによって、フラグメントビューのみを破棄し、フラグメントマネージャでその状態を保持します。ただし、removingにより、フラグメントマネージャからフラグメントとその状態を削除します。さらに、フラグメントビューがUIコンテナに追加された場合は削除されます。したがって、どちらもフラグメントビューを破棄しますが、デタッチによりフラグメントマネージャにフラグメントの状態が保持されます。


ここで、アタッチと追加を見てみましょう。

追加

アクティビティ状態にフラグメントを追加します。オプションで、このフラグメントは、アクティビティのコンテナビューにビュー(Fragment.onCreateViewがnull以外を返す場合)を含めることもできます。

添付

Detach(Fragment)を使用してUIから以前にdeatchedした後に、フラグメントを再アタッチします。これにより、ビュー階層が再作成され、UIにアタッチされて表示されます。

その意味は:

フラグメントを追加すると、アクティビティ状態に追加され、そのビューが定義済みのコンテナビューに追加されます。ただし、フラグメントがまだUIに追加されていない場合は、何も添付しないことで表示されます。フラグメントマネージャーにアタッチするだけです。ただし、ビューが既にUIのコンテナーに追加されており、その後で切り離された場合、アタッチするとそのコンテナーに再び表示されます。最後に、フラグメントビューを一時的に破棄し、アクティビティ内の状態を失わずに将来的にそのビューを表示および構築する場合は、アタッチとデタッチを使用できます。

83
VSB