Il corretto utilizzo di sub frammenti con (Bambino)FragmentManager

Come faccio a utilizzare correttamente i Frammenti Frammenti?

Mio (semplificata) di un caso d’uso è la seguente, ho un attività con un layout frammento e questo frammento di trenta contiene un sub frammento… tutti i frammenti sono aggiunti manualmente ai loro genitori…

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

Ora, nella mia attività onCreate faccio seguenti:

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);
}

E nel mio frammenti onCreate ho/creare il mio 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();
}

Problema

Dopo la rotazione dello schermo, il mio SubFragment è aggiunto due volte… Se io uso l’attività FragmentManager allora funziona… Ma perché non lavorare con il ChildFragmentManager? Naturalmente, il Frammento è un nuovo frammento, ma l’attività è uno nuovo, così perché funziona con l’attività del FragmentManager, ma non con il padre frammento di uno?

In un frammento, devo utilizzare i frammenti ChildFragmentManager, non dovrei?

InformationsquelleAutor prom85 | 2013-12-19

 

One Reply
  1. 10

    Si dovrebbe aggiungere SubFragment per Fragment stesso modo come si aggiunge Fragment per Activity. Voglio dire, l’aggiunta di Fragment per Activity dovrebbe assomigliare a questo:

     @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();
       }
     }

    Aggiunta di SubFragment per MainFragment dovrebbe assomigliare a questo:

        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();
            }
          }
        }

    oppure si può aggiungere un bambino frammento di Fragment in onCreate metodo

    • penso che questo è ciò che l’OP ha postato in questione.
    • no, lui usa onCreateVIEW vs onCreate. Penso che questa sia la risposta corretta
    • Se Un frammento contiene B, B detiene C quindi dovrebbe frammento C anche essere aggiunti con il bambino frammento manager?

Lascia un commento