Привязка к жизненному циклу фрагмента, как 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

Вам придется переопределить методы жизненного цикла фрагментов, затем вы можете инициализировать этот класс где угодно. Надеюсь это поможет

Другие вопросы по тегам