android - studio - Conectarse al ciclo de vida del fragmento como Application.ActivityLifecycleCallbacks
how to implement fragments in android studio (3)
En Android, si tiene el contexto de la aplicación, puede registrar una instancia de Application.ActivityLifecycleCallbacks
que se llamará cada vez que una Actividad pase por una de sus devoluciones de llamada de ciclo de vida.
¿Cómo puedo lograr lo mismo para los fragmentos? Creo que no hay tal interfaz para Fragmentos ni un lugar claro donde agregaría eso.
Tal vez personalizando un FragmentHostCallback
creando un FragmentController
pero, ¿cómo puedo conectarlo para toda la aplicación?
El caso de uso es una biblioteca que necesita ser notificada cada vez que un Fragmento llama a sus devoluciones de llamada de ciclo de vida y no quiero crear un BaseFragment. Quiero que me llamen solo desde onCreate de Application y eso es todo (si es posible ...).
EDITAR:
He creado un problema en Android Open Source Project sobre esto.
Bueno, la actividad envía sus devoluciones de llamada para el FragmentManager. Más tarde el administrador de fragmentos despacha las llamadas al Fragmento. No hay lugar para registrar el FragmentLifeCycleCallback en el FragmentManager. Sin embargo, en cualquier momento después de que se inicie el fragmento u puede obtener el estado del fragmento de la variable mState en el fragmento. solo puede rastrear el backstack en el administrador de fragmentos de la siguiente manera:
final FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Log.i("BACKSTACK","Count" +fragmentManager.getBackStackEntryCount());
}
});
Espero que esto ayude.
Desde la versión 25.2.0 de la biblioteca de soporte de Android, la clase FragmentManager.FragmentLifecycleCallbacks
es estática y accesible para todos.
Ahora podemos usar una instancia de esa clase y registrarla en el 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);
}
}
Puedes crear una clase como esta, preferirías Singleton
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
Tendrá que anular los métodos del ciclo de vida de los Fragmentos, luego puede iniciar esta clase en cualquier lugar que desee. Espero que esto ayude