web-dev-qa-db-ja.com

(Child)FragmentManagerでのサブサブフラグメントの適切な使用

FragmentsでFragmentsを適切に使用するにはどうすればよいですか?

私の(簡略化された)使用例は次のとおりです。レイアウトフラグメントのあるアクティビティがあり、このフラグメント自体にサブフラグメントが含まれています...すべてのフラグメントは親に手動で追加されます...

----------------------------------------------------------
- Activity                                               -
-                                                        -
-                                                        -
-     ---------------------------------------            -
-     - Fragment                            -            -
-     -                                     -            -
-     -    -----------------                -            -
-     -    - SubFragment   -                -            -
-     -    -               -                -            -
-     -    -               -                -            -
-     -    -----------------                -            -
-     ---------------------------------------            -
-                                                        -
----------------------------------------------------------

今私の活動のonCreateで私は以下を行います:

if (savedInstanceState == null)
{
    // I create the fragment
    mMainFragment = new MainFragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_main, mMainFragment);
    transaction.commit();
}
else
{
    // I retrieve the fragment
    mMainFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_main);
}

そして私のフラグメントでonCreate私は私のSubFragmentを取得/作成します:

mSubFragment = getChildFragmentManager().findFragmentByTag(SubFragment.class.getName());
if (mSubFragment == null)
{
    mSubFragment = new SubFragment();
    getChildFragmentManager().beginTransaction().add(R.id.fragment_sub, mSubFragment, SubFragment.class.getName()).commit();
}

問題

画面の回転後、SubFragmentが2回追加されます...アクティビティのFragmentManagerを使用すると機能しますが、ChildFragmentManagerで機能しないのはなぜですか?もちろん、Fragmentは新しいフラグメントですが、アクティビティも新しいものなので、なぜそれがアクティビティのFragmentManagerで機能し、親フラグメントのフラグメントでは機能しないのですか?

フラグメントでは、フラグメントChildFragmentManagerを使用する必要がありますか?

21
prom85

SubFragmentFragmentに追加するのと同じ方法で、FragmentActivityに追加する必要があります。つまり、FragmentActivityに追加すると、次のようになります。

 @Override
 public void onCreate(Bundle savedInstanceState) {
   ....
   if (savedInstanceState == null){
      //add fragment
      mMainFragment = new MainFragment();
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
      transaction.replace(R.id.fragment_main, mMainFragment);
      transaction.commit();
   }
 }

SubFragmentMainFragmentに追加すると、次のようになります。

    public class MainFragment extends Fragment{

      @Override
      public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState) {
           ...
        if (savedInstanceState == null){
           mSubFragment = new SubFragment();

           //add child fragment
           getChildFragmentManager()
                   .beginTransaction()
                   .add(R.id.fragment_sub, mSubFragment, "tag")
                   .commit();
        }
      }
    }

または、FragmentメソッドのonCreateに子フラグメントを追加できます

11
ashakirov