2015-09-22 19 views
22

In Android, se si dispone del contesto dell'applicazione, è possibile registrare un'istanza Application.ActivityLifecycleCallbacks che verrà chiamata ogni volta che un'attività passa attraverso uno dei suoi callback del ciclo di vita.Collegamento al ciclo di vita di un frammento come Application.ActivityLifecycleCallbacks

Come posso ottenere lo stesso risultato per i frammenti? Penso che non ci sia un'interfaccia di questo tipo per Fragments, né un luogo chiaro in cui aggiungerei questo.

Forse personalizzare un FragmentHostCallback creando un FragmentController ma come posso collegarlo per l'intera applicazione?

Il caso d'uso è una libreria che deve essere notificata ogni volta che Fragment chiama i suoi callback del ciclo di vita e non voglio creare un BaseFragment. Voglio essere chiamato solo da Application's onCreate e il gioco è fatto (se possibile ...).

EDIT:

Ho creato an issue in Android Open Source Project su questo.

risposta

16

Dalla versione 25.2.0 della libreria di supporto Android, la classe FragmentManager.FragmentLifecycleCallbacks è statica e accessibile a tutti.

Ora è possibile utilizzare un'istanza di tale classe e registrarla nello supportFragmentManager dello Activity.

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

Qualsiasi soluzione nella versione precedente alla 25.2.0? –

+0

Non che io sappia. Potresti simularlo con un approccio 'BaseFragment' che è molto limitato rispetto a questo. Ho visto altri con modi più "mistici" come avere un thread in ascolto di eventi ma non averlo testato e non lo consiglierei. Ora si tratta solo di aggiornare la libreria di supporto – Olinasc

1

Bene l'attività invia i suoi callback per FragmentManager. Successivamente il gestore dei frammenti invia le chiamate al frammento. Non c'è spazio per registrare FragmentLifeCycleCallback in FragmentManager. Tuttavia, in qualsiasi momento dopo l'inizializzazione del frammento, è possibile ottenere lo stato Fragment dalla variabile mState nel Fragment. è possibile monitorare solo il backstack nel gestore frammento come di seguito:

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

speranza che questo vi aiuterà.