Ereignis, wenn die FragmentTransaction abgeschlossen ist

Lesezeit: 4 Minuten

Ist es möglich, ein Ereignis zu haben, wenn die FragmentTransaction abgeschlossen ist?

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment).commit();

Tatsächlich verwende ich eine Schublade für meine Anwendung und möchte sie auslösen invalidateOptionsMenu(); wenn die Transaktion abgeschlossen ist, um das Menü meiner Aktionsleiste zu ändern.

Sie müssen nicht warten, bis die Fragmenttransaktion abgeschlossen ist, Sie können anrufen

getSupportFragmentManager().executePendingTransactions();

nach Ihrem Aufruf der Funktion commit().

Dadurch wird sichergestellt, dass die Transaktion abgeschlossen ist.

  • Mein Problem ist nicht, ob meine Transaktion gut gelaufen ist, sondern zu wissen, wann sie abgeschlossen ist. Ansonsten gibt es eine Lücke zwischen der Anzeige meiner Ansicht und der Menüleiste meiner Aktion.

    – lopez.mikhael

    1. November 2013 um 10:16 Uhr

  • Die Transaktion wird zwangsweise abgeschlossen, wenn Sie executePendingTransactions aufrufen. Es dauert jedoch einige Zeit, bis die Ansicht geladen ist. Um das herauszufinden, verwenden Sie eine statische Funktion und rufen Sie sie aus dem onResume Ihres Fragments auf.

    – Eldhose M Babu

    1. November 2013 um 12:04 Uhr


  • Ich denke, dies ist eine gültige Antwort, auch wenn es sich nicht um ein “Ereignis” an sich handelt. executePendingTransactions() wird Block bis die Transaktion abgeschlossen ist, und der nächste Befehl danach wird nach Abschluss der Transaktion aufgerufen, genau wie ein Ereignis und sogar ohne den Overhead des Ereignis-Listeners.

    – Amir Uval

    7. Mai 2014 um 7:39 Uhr

  • Dies ist nicht genau, während ein Fragment nach dem hinzugefügt wird verpflichten und AusführenPendingTransactions zurückgegeben wird, enthält der Fragmentstapel das hinzugefügte Fragment, während ein Fragment entfernt oder ersetzt wird und danach verpflichten und AusführenPendingTransactions aufgerufen wird, befindet sich das entnommene Fragment bis zu einem späteren Zeitpunkt noch im Stack. Aus UX-Gründen ist es sinnvoll, das Fragment später zu entfernen und zu zerstören, aber dies ist nicht der richtige Weg, um ein Transaktionsabschlussereignis zu erhalten!

    – TacB0sS

    7. Mai 2015 um 18:48 Uhr


  • Diese Antwort hat mir nicht gefallen, aber mir wurde klar, dass ich eine Problemumgehung verwenden könnte, indem ich ein Ereignis mit EventBus direkt nach dem Aufruf von setze executePendingTransactions()und lassen Sie mein Fragment auf dieses Ereignis warten, und wenn es die Kriterien zum Löschen erfüllt, kann es sich durch Aufrufen selbst öffnen popFragment() auf seinem Fragmentmanager. (Das habe ich versucht auszudrücken popFragment() Code in onResume(), wenn seine Modelldaten nicht existierten, aber es gab die IllegalStateException: FragmentManager is already executing transactions Fehler.) Ich habe im Grunde mein eigenes “Ereignis” erstellt, wenn es sich um eine abgeschlossene Transaktion handelt.

    – Rock Lee

    9. März 2017 um 20:20 Uhr


Hallo! Versuche dies:

private OnBackStackChangedListener backStackListener =  new OnBackStackChangedListener() {

    @Override
    public void onBackStackChanged() {
        String name = "";
        int position = getSupportFragmentManager().getBackStackEntryCount();
        if(position!=0){
           FragmentManager.BackStackEntry backEntry=getSupportFragmentManager().getBackStackEntryAt(position-1);
           name=backEntry.getName();


        }
        if(position==0){
            mainActionBar();
        }
        else if(name=="someWord"){
            mainActionBar2();
        }
        else{
            mainActionBar3();
        }

    }
};
 getSupportFragmentManager().addOnBackStackChangedListener(backStackListener);

Und in der Transaktion fügen Sie das Tag wie folgt zu BackStack hinzu:

getSupportFragmentManager().beginTransaction()
                .replace(R.id.main, SomeFragment.newInstance(some argument))
                .addToBackStack("someWord").commit();

  • Dies gilt nur, wenn Sie keine benutzerdefinierten Animationen hinzufügen.

    – Akhil Papa

    9. Mai 2015 um 12:51 Uhr

  • onBackStackChanged wird beim Übergangsstart aufgerufen. Dies ist niemals gültig.

    – Servus7

    14. Juli 2015 um 17:43 Uhr

  • Danke @Mikelis, ich wollte bei Bedarf den Zurück-Button anzeigen, addBackStackChangedListener hat als Charme funktioniert 🙂

    – Gipfel

    8. Januar 2020 um 15:03 Uhr

Zu spät, aber dies kann helfen (hier für jemanden zu setzen, kann Folgendes verwenden):

....
fragmentTransaction.replace(R.id.contentFrame, fragment);
fragmentTransaction.runOnCommit(new Runnable() // be carefull on this call. check documentation!!
{
    @Override
    public void run()
    {
        ... do something...  // this will  run after fragment's on resume. you can check.
    }
});
fragmentTransaction.commit();

Bitte überprüfen Sie die Einschränkungen der Methode runOnCommit()!

  • Erfordert API 26, das nicht immer verfügbar ist.

    – Stephen M -im Streik-

    27. September 2019 um 18:36 Uhr

  • Es ist keine API 26 erforderlich, wenn Sie die unterstützende FragmentTransaction-Bibliothek verwenden (was die meisten sein sollten). androidx.fragment.app.FragmentTransaction

    – Riot macht Schlag auf Schlag

    10. März 2020 um 22:11 Uhr


@Override
public void onResume() {
    super.onResume();
    getActivity().invalidateOptionsMenu();
}

Wenn die FragmentTransaction abgeschlossen ist, werden die Lebenszyklusmethoden des Fragments aufgerufen, wie z. B. onResume()

Zu Ihrer Information, Fragment kann ein eigenes Menü haben, siehe http://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu(boolean)

Benutzeravatar von Mark Minto
Markus Minto

Sie können den Ratschlag in dieser Antwort verwenden — führen Sie den Code aus, den Sie benötigen, nachdem die Transaktion abgeschlossen ist onAnimationEnd Methode.

Damit dies funktioniert, müssen Sie eine Animation auf der FragmentTransaction setzen, z

transaction.setCustomAnimations(R.anim.slide_in_left,
                                R.anim.slide_out_right);

Benutzeravatar von UriB
UriB

Sie könnten in Betracht ziehen, commitNow() anstelle von commit() zu verwenden, und dann können Sie sicher sein, dass die Transaktion abgeschlossen ist. Natürlich ist es eine Frage der Komplexität der Transaktion, ob Sie es tun sollten oder nicht.

BADER EDDINE QODIAs Benutzeravatar
BADER EDDINE QODIA

Ich glaube, ich antworte so spät auf Ihre Frage, aber es könnte jemandem helfen, der die gleiche Lösung will:

ft.getLifecycle().addObserver(new LifecycleEventObserver() {
                 @Override
                 public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                     if(event.getTargetState() == Lifecycle.State.RESUMED){
                         new Handler().postDelayed(new Runnable() {
                             @Override
                             public void run() {
                                invalidateOptionsMenu();
                             }
                         }, 500);
                     }
                 }
             });

1393770cookie-checkEreignis, wenn die FragmentTransaction abgeschlossen ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy