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.
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);
}
}
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.
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