Привязка к жизненному циклу фрагмента, как Application.ActivityLifecycleCallbacks
В Android, если у вас есть контекст приложения, вы можете зарегистрировать Application.ActivityLifecycleCallbacks
экземпляр, который будет вызываться каждый раз, когда действие проходит один из своих обратных вызовов жизненного цикла.
Как я могу сделать то же самое для фрагментов? Я думаю, что нет никакого интерфейса для Фрагментов, и нет никакого ясного места, где я бы добавил это.
Может быть, настройка FragmentHostCallback
создавая FragmentController
но как я могу подключить это для всего приложения?
Вариант использования - это библиотека, которую нужно уведомлять каждый раз, когда Fragment вызывает свои обратные вызовы жизненного цикла, и я не хочу создавать BaseFragment. Я хочу, чтобы меня вызывали только из onCreate приложения и все (если возможно...).
РЕДАКТИРОВАТЬ:
Я создал проблему в Android Open Source Project по этому поводу.
3 ответа
Начиная с версии 25.2.0 библиотеки поддержки Android, класс FragmentManager.FragmentLifecycleCallbacks
статичен и доступен для всех.
Теперь мы можем использовать экземпляр этого класса и зарегистрировать его в supportFragmentManager
из 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);
}
}
Ну, активность отправляет свои обратные вызовы для FragmentManager. Позже менеджер фрагментов отправляет вызовы фрагменту. Нет места для регистрации FragmentLifeCycleCallback в FragmentManager. Однако в любое время после инициализации фрагмента вы можете получить состояние фрагмента из переменной mState во фрагменте. вы можете отслеживать только backstack в менеджере фрагментов, как показано ниже:
final FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Log.i("BACKSTACK","Count" +fragmentManager.getBackStackEntryCount());
}
});
надеюсь, это поможет.
Вы можете создать класс, как это, синглтон будет предпочтительным
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
Вам придется переопределить методы жизненного цикла фрагментов, затем вы можете инициализировать этот класс где угодно. Надеюсь это поможет