2015-09-22 4 views
22

In Android können Sie im Anwendungskontext eine Application.ActivityLifecycleCallbacks Instanz registrieren, die jedes Mal aufgerufen wird, wenn eine Aktivität einen ihrer Lebenszyklusrückrufe durchläuft.Einbinden in den Lebenszyklus eines Fragments wie Application.ActivityLifecycleCallbacks

Wie kann ich dasselbe für Fragmente erreichen? Ich denke, dass es für Fragments keine solche Schnittstelle gibt und auch keinen klaren Ort, an dem ich hinzufügen würde.

Vielleicht anpassen ein FragmentHostCallback Erstellen eines FragmentController aber wie kann ich das für die gesamte Anwendung anschließen?

Der Anwendungsfall ist eine Bibliothek, die jedes Mal benachrichtigt werden muss, wenn ein Fragment seine Lebenszyklus-Callbacks aufruft und ich kein BaseFragment erstellen möchte. Ich möchte nur von application onCreate aufgerufen werden und das wars (wenn möglich ...).

EDIT:

Ich habe an issue in Android Open Source Project darüber erstellt.

Antwort

16

Seit Version 25.2.0 der Android-Support-Bibliothek ist die Klasse FragmentManager.FragmentLifecycleCallbacks statisch und für alle zugänglich.

Wir können jetzt eine Instanz dieser Klasse verwenden und sie in der supportFragmentManager der Activity registrieren.

public class ExampleActivity extends AppCompatActivity { 

    public void onCreate(Bundle savedInstaceState) { 

      // initialization code 
      getSupportFragmentManager() 
      .registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() { 
       @Override 
       public void onFragmentPreAttached(FragmentManager fm, Fragment f, Context context) { 
        super.onFragmentPreAttached(fm, f, context); 
       } 

       @Override 
       public void onFragmentAttached(FragmentManager fm, Fragment f, Context context) { 
        super.onFragmentAttached(fm, f, context); 
       } 

       @Override 
       public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) { 
        super.onFragmentCreated(fm, f, savedInstanceState); 
       } 

       @Override 
       public void onFragmentActivityCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) { 
        super.onFragmentActivityCreated(fm, f, savedInstanceState); 
       } 

       @Override 
       public void onFragmentViewCreated(FragmentManager fm, Fragment f, View v, Bundle savedInstanceState) { 
        super.onFragmentViewCreated(fm, f, v, savedInstanceState); 
       } 

       @Override 
       public void onFragmentStarted(FragmentManager fm, Fragment f) { 
        super.onFragmentStarted(fm, f); 
       } 

       @Override 
       public void onFragmentResumed(FragmentManager fm, Fragment f) { 
        super.onFragmentResumed(fm, f); 
       } 

       @Override 
       public void onFragmentPaused(FragmentManager fm, Fragment f) { 
        super.onFragmentPaused(fm, f); 
       } 

       @Override 
       public void onFragmentStopped(FragmentManager fm, Fragment f) { 
        super.onFragmentStopped(fm, f); 
       } 

       @Override 
       public void onFragmentSaveInstanceState(FragmentManager fm, Fragment f, Bundle outState) { 
        super.onFragmentSaveInstanceState(fm, f, outState); 
       } 

       @Override 
       public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) { 
        super.onFragmentViewDestroyed(fm, f); 
       } 

       @Override 
       public void onFragmentDestroyed(FragmentManager fm, Fragment f) { 
        super.onFragmentDestroyed(fm, f); 
       } 

       @Override 
       public void onFragmentDetached(FragmentManager fm, Fragment f) { 
        super.onFragmentDetached(fm, f); 
       } 
      }, true); 
     } 
} 
+0

Jede Lösung auf Version vor 25.2.0? –

+0

Nicht, dass mir das bekannt ist. Sie könnten es mit einem "BaseFragment" -Ansatz simulieren, der im Vergleich dazu sehr begrenzt ist. Ich habe andere mit eher "mystischen" Wegen gesehen, wie wenn ein Thread nach Ereignissen lauscht, aber ich habe es nicht getestet und würde es nicht empfehlen. Jetzt ist es nur eine Frage der Aktualisierung der Support-Bibliothek – Olinasc

1

Nun sendet die Aktivität ihre Rückrufe für den FragmentManager. Später versendet der Fragmentmanager die Aufrufe an das Fragment. Es gibt keinen Platz zum Registrieren des FragmentLifeCycleCallback im FragmentManager. Sie können jedoch jederzeit, nachdem das Fragment initialisiert wurde, den Fragment-Zustand von der mState-Variable im Fragment erhalten. Sie können nur unter den Backstack im Fragment-Manager verfolgen:

 final FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Log.i("BACKSTACK","Count" +fragmentManager.getBackStackEntryCount()); 
     } 
    }); 

Hoffnung, das wird helfen.

Verwandte Themen