web-dev-qa-db-fra.com

Accrocher au cycle de vie d'un fragment comme Application.ActivityLifecycleCallbacks

Sous Android, si vous avez le contexte Application, vous pouvez enregistrer une instance Application.ActivityLifecycleCallbacks qui sera appelée à chaque fois qu'une activité passe par l'un de ses rappels de cycle de vie.

Comment puis-je accomplir la même chose pour les fragments? Je pense qu’il n’existe pas d’interface de ce type pour Fragments, ni d’endroit clair où je voudrais ajouter cela. 

Peut-être personnaliser une FragmentHostCallback créant une FragmentController mais comment puis-je le brancher pour l’ensemble de l’application?

Le cas d'utilisation est une bibliothèque qui doit être notifiée chaque fois qu'un fragment appelle ses rappels de cycle de vie et je ne souhaite pas créer de BaseFragment. Je veux être appelé uniquement à partir de l'application onCreate et c'est tout (si possible ...).

MODIFIER:

J'ai créé un problème dans Android Open Source Project à ce sujet.

25
Olinasc

Depuis la version 25.2.0 de la bibliothèque de support Android, la classe FragmentManager.FragmentLifecycleCallbacks est statique et accessible à tous. 

Nous pouvons maintenant utiliser une instance de cette classe et l'enregistrer dans la supportFragmentManager de la 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);
       }
}
22
Olinasc

L'activité envoie ses rappels pour le FragmentManager. Plus tard, le gestionnaire de fragments envoie les appels au fragment. Il n'y a pas d'endroit pour enregistrer FragmentLifeCycleCallback dans FragmentManager. Cependant, à tout moment après l'initialisation du fragment, vous pouvez obtenir l'état du fragment à partir de la variable mState dans le fragment.

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

espérons que cela aidera.

3
Mohanad ALKHOULI

vous pouvez créer une classe comme celle-ci, Singleton serait préféré

import Android.app.Activity;
import Android.app.Application;
import Android.app.Fragment;
import Android.app.FragmentManager;
import Android.os.Build;
import Android.os.Bundle;

@RequiresApi(api = Build.VERSION_CODES.O)
public class PerfLifecycleCallbacks extends FragmentManager.FragmentLifecycleCallbacks
implements Application.ActivityLifecycleCallbacks

Vous devrez redéfinir les méthodes de cycle de vie des fragments, puis vous pourrez initialiser cette classe n’importe où, à votre guise. J'espère que cela t'aides

0
Swapnil