wake-up-neo.com

Unterschied zwischen add (), replace () und addToBackStack ()

Was ist der Hauptunterschied zwischen dem Aufruf dieser Methoden:

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);

Was bedeutet es, ein bereits vorhandenes Fragment zu ersetzen, dem Aktivitätsstatus ein Fragment hinzuzufügen und dem Back-Stack eine Aktivität hinzuzufügen?

Zweitens: Wird mit findFragmentByTag() nach einem Tag gesucht, das von der add()/replace()-Methode oder der addToBackStack()-Methode hinzugefügt wurde?

254
AndroidDev

1)fragmentTransaction.addToBackStack(str);

Beschreibung - Fügen Sie diese Transaktion dem Back Stack hinzu. Dies bedeutet, dass die Transaktion nach dem Festschreiben gespeichert wird und die Operation rückgängig gemacht wird, wenn sie später vom Stapel entfernt wird.

2)fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

Beschreibung - Ersetzen Sie ein vorhandenes Fragment, das einem Container hinzugefügt wurde. Dies entspricht im Wesentlichen dem Aufruf von remove (Fragment) für alle aktuell hinzugefügten Fragmente, die mit derselben containerViewId hinzugefügt wurden, und dann (int, Fragment, String) mit den gleichen Argumenten hinzugefügt.

3)fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

Beschreibung - Fügt dem Aktivitätsstatus ein Fragment hinzu. Dieses Fragment kann optional auch eine Ansicht (wenn Fragment.onCreateView nicht NULL zurückgibt) in einer Containeransicht der Aktivität enthalten.

Was bedeutet es, ein bereits vorhandenes Fragment zu ersetzen und .__ hinzuzufügen. ein Fragment zum Aktivitätsstatus und Hinzufügen einer Aktivität zum Hintergrund Stapel ?

Es gibt einen Stack, in dem alle Aktivitäten im laufenden Zustand gehalten werden. Fragmente gehören zur Aktivität. Sie können sie hinzufügen, um sie in eine Aktivität einzubetten.

Sie können mehrere Fragmente in einer einzigen Aktivität kombinieren, um eine Benutzeroberfläche mit mehreren Bereichen zu erstellen und ein Fragment in mehreren Aktivitäten wiederzuverwenden. Dies ist im Wesentlichen hilfreich, wenn Sie Ihren Fragment-Container in verschiedenen Layouts definiert haben. Sie müssen lediglich ein beliebiges anderes Fragment in einem beliebigen Layout ersetzen.

Wenn Sie zum aktuellen Layout navigieren, haben Sie die ID dieses Containers, um ihn durch das gewünschte Fragment zu ersetzen. 

Sie können auch mit der popBackStack()-Methode zum vorherigen Fragment im backStack zurückkehren. Dazu müssen Sie dieses Fragment mit addToBackStack() und dann commit() zum Stack hinzufügen. Dies ist in umgekehrter Reihenfolge, wobei der Strom oben ist.

findFragmentByTag sucht nach dem Tag, das durch das Hinzufügen/Ersetzen von .__ hinzugefügt wurde. Methode oder die Methode addToBackStack?

Ob hängt davon ab, wie Sie das Tag hinzugefügt haben. Es findet dann nur ein Fragment anhand seines Tags, das Sie zuvor definiert haben, entweder wenn es aus XML aufgeblasen wurde, oder wie es geliefert wurde, wenn es in einer Transaktion hinzugefügt wurde.

Referenzen: FragmentTransaction

290
My God

Ein weiterer wichtiger Unterschied zwischen add und replace ist: replace entfernt das vorhandene Fragment und fügt ein neues Fragment hinzu. Das heißt, wenn Sie die Zurück-Taste drücken, wird das ersetzte Fragment mit dem Aufruf von onCreateView erstellt. Während add die vorhandenen Fragmente beibehält und ein neues Fragment hinzufügt, bedeutet dies, dass das vorhandene Fragment aktiv ist und sich nicht im "paused" -Zustand befindet. Wenn eine Schaltfläche "Zurück" gedrückt wird, wird die Schaltfläche "onCreateView" nicht für das vorhandene Fragment aufgerufen (das zuvor vorhandene Fragment Fragment wurde hinzugefügt). In Bezug auf die Lebenszyklusereignisse des Fragments onPause, onResume, onCreateView und andere Lebenszyklusereignisse werden im Fall von replace aufgerufen, jedoch nicht im Fall von add

Edit: Man sollte vorsichtig sein, wenn sie eine Art Event-Bus-Bibliothek wie Greenrobots Eventbus verwendet und dasselbe Fragment erneut verwendet, um das Fragment über add zu stapeln. Obwohl Sie die bewährte Methode befolgen und den Ereignisbus in onResume registrieren und die Registrierung in onPause aufheben, ist der Ereignisbus in diesem Szenario immer noch in jeder Instanz des hinzugefügten Fragments aktiv, da das add-Fragment keine dieser Fragment-Lebenszyklusmethoden aufruft. Als Ergebnis würde der Ereignisbus-Listener in jeder aktiven Instanz des Fragments dasselbe Ereignis verarbeiten, das möglicherweise nicht Ihren Vorstellungen entspricht. 

291
Jeevan

Beispiel: Eine Aktivität hat 2 Fragmente und wir verwenden FragmentManager, um jedes Fragment mit addToBackstack in einem Layout in Activity zu ersetzen

Use replace

Go Fragment1

Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Go Fragment2

Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume

Pop Fragment2

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Pop Fragment1

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy

Add add

Go Fragment1

Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Go Fragment2

Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume

Pop Fragment2

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy

Pop Fragment1

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy

Beispielprojekt

52
Linh

Der grundlegende Unterschied zwischen add() und replace() kann wie folgt beschrieben werden:

  • add() wird verwendet, um einem Wurzelelement einfach ein Fragment hinzuzufügen.
  • replace() verhält sich ähnlich, zuerst werden jedoch vorherige Fragmente entfernt und dann das nächste Fragment hinzugefügt.

Den genauen Unterschied erkennen wir, wenn wir addToBackStack() zusammen mit add() oder replace() verwenden.

Wenn wir bei add()... die Zurück-Taste drücken, wird onCreateView nie aufgerufen, aber bei replace(), wenn die Zurück-Taste gedrückt wird ... wird jedes Mal oncreateView aufgerufen.

15
Avanindra_dubey

Obwohl es sich um eine alte Frage handelt, die bereits beantwortet wurde, können diese nächsten Beispiele möglicherweise die akzeptierte Antwort ergänzen und für einige neue Programmierer in Android nützlich sein, so wie ich es bin.

Option 1 - "AddToBackStack ()" wird nie verwendet

Fall 1A - Hinzufügen, Entfernen und Klicken auf die Schaltfläche Zurück

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

Fall 1B - Hinzufügen, Ersetzen und Klicken auf die Schaltfläche Zurück

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

Option 2 - "addToBackStack ()" wird immer verwendet

Fall 2A - Hinzufügen, Entfernen und Klicken auf die Schaltfläche Zurück

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Fragment B is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Fall 2B - Hinzufügen, Ersetzen, Entfernen und Klicken auf die Schaltfläche Zurück

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView()  
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()   
Fragment B :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Option 3 - "addToBackStack ()" wird nicht immer verwendet (in den folgenden Beispielen bedeutet "ohne", dass es nicht verwendet wird)

Fall 3A - Hinzufügen, Entfernen und Klicken auf die Schaltfläche Zurück

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Fall 3B - Hinzufügen, Ersetzen, Entfernen und Klicken auf die Schaltfläche Zurück

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()   
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible
3
Javi

Wenn wir das erste Fragment -> das zweite Fragment mit der Methode add () hinzufügen

 btn_one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"Click First 
Fragment",Toast.LENGTH_LONG).show();

                Fragment fragment = new SecondFragment();
                getActivity().getSupportFragmentManager().beginTransaction()
                        .add(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
//                        .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

            }
        });

Wenn wir add () in fragment verwenden

E/Keshav SecondFragment: onAttach
E/Keshav SecondFragment: onCreate
E/Keshav SecondFragment: onCreateView
E/Keshav SecondFragment: onActivityCreated
E/Keshav SecondFragment: onStart
E/Keshav SecondFragment: onResume

Wenn wir replace () in fragment verwenden

nter First -> Second mit replace () - Methode zum ersten Fragment zum zweiten Fragment wechseln

 btn_one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"Click First Fragment",Toast.LENGTH_LONG).show();

                Fragment fragment = new SecondFragment();
                getActivity().getSupportFragmentManager().beginTransaction()
//                        .add(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();
                        .replace(R.id.fragment_frame, fragment, fragment.getClass().getSimpleName()).addToBackStack(null).commit();

            }
        });

E/Keshav SecondFragment: onAttach
E/Keshav SecondFragment: onCreate

E/Keshav FirstFragment: onPause

E/Keshav FirstFragment: onStop

E/Keshav FirstFragment: onDestroyView

E/Keshav SecondFragment: onCreateView
E/Keshav SecondFragment: onActivityCreated
E/Keshav SecondFragment: onStart
E/Keshav SecondFragment: onResume
1
Keshav Gera

add () ... Dies ist die Verwendung für das Hinzufügen von Fragmenten zu Framelayout und die Verwendung dieses DisAdvantages. Vorheriges Fragment kann im Hintergrund angezeigt werden

transaction.add(R.id.framelayout, fragment);

replace () ... Dies wird verwendet, um das Fragment durch Framelayout zu ersetzen und um diesen Vorteil zu nutzen. Vorteil ist, dass das vorherige Fragment nicht im Hintergrund angezeigt werden kann, sondern das gesamte Fragment speichert

transaction.replace(R.id.framelayout, fragment);

addToBackStack () ... wird verwendet, um alle Fragmente im Hintergrund zu speichern. Wenn der Benutzer die Zurück-Taste drücken kann, navigieren Sie zum vorherigen Fragment

transaction.addToBackStack(null);
0
MD Khali