Подтвердить что ты не робот

Разница между add() и replace() с жизненным циклом фрагментации

Моя программа имеет 6 фрагментов: Fragment1, Fragment2,....- > Fragment6.

Я использую оператор add() и replace() для переключения между фрагментом и отслеживания их жизненного цикла.

Fragment1 добавить Fragment2 добавить Fragment3 добавить Fragment4 добавить Fragment5 заменить Fragment6

Лог-кота, чтобы показать свой жизненный цикл (у меня есть некоторые printf-точки в onCreate, onCreateView, onDestroyView, onDestroy для отслеживания)


Тег ______________ Текст

Fragment1_ _______ _onCreate

Fragment1_ _______ _onCreateView

Fragment1_ _______ _add Fragment2

Fragment2_ _______ _onCreate

Fragment2_ _______ _onCreateView

Fragment2_ _______ _add Fragment3

Fragment3_ _______ _onCreate

Fragment3_ _______ _onCreateView

Fragment3_ _______ _add Fragment4

Fragment4_ _______ _onCreate

Fragment4_ _______ _onCreateView

Fragment4_ _______ _add Fragment5

Fragment5_ _______ _onCreate

Fragment5_ _______ _onCreateView

Fragment5 _______ заменить Fragment6

Фрагмент1 _______ onDestroyView

Фрагмент3 _______ onDestroyView

Fragment5 _______ onDestroyView

Fragment6_ _______ _onCreate

Fragment6_ _______ _onCreateView


Мои вопросы:

Почему после того, как Fragment5 заменен на Fragment6, Fragment1 и 3 & 5 уничтожили их представление?.

Что происходит с Fragment2 и 4?

Почему Фрагмент2 и 4 не уничтожают их представление как Fragment1 и 3 & 5?

Пожалуйста, помогите мне полностью разобраться в жизненном цикле фрагмента при вызове метода add() и replace().


Обновите метод addFragment и replaceFragment:

public void addFragment(Fragment fromFragment, Fragment toFragment) {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.container,toFragment, toFragment.getClass().getName());
    transaction.hide(fromFragment);
    transaction.addToBackStack(toFragment.getClass().getName());
    transaction.commit();
}

public void replaceFragment(Fragment fromFragment, Fragment toFragment) {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.container,toFragment, toFragment.getClass().getName());
    transaction.hide(fromFragment);
    transaction.addToBackStack(toFragment.getClass().getName());
    transaction.commit();
}
4b9b3361

Ответ 1

Если вы используете FragmentTransaction, чтобы скрыть фрагмент, он все равно может находиться в рабочем состоянии своего жизненного цикла, но его пользовательский интерфейс был отсоединен от окна, чтобы он больше не отображался. Таким образом, вы можете технически по-прежнему взаимодействовать с фрагментом и снова подключать его интерфейс, который вам понадобится. Если вы замените фрагмент, вы фактически вытаскиваете его из контейнера, и он будет проходить через все события разрыва в жизненном цикле (onPause, onStop и т.д.), И если по какой-то причине вам понадобится этот фрагмент снова вам придется вставить его обратно в контейнер и позволить ему снова запустить всю свою инициализацию.

Ответ 2

При замене вы заменяете все фрагменты (1,2,3,4,5) в ViewGroup R.id.container для нового Fragment (6). Как только фрагменты будут удалены, они будут уничтожены. Когда они будут уничтожены, они вызовут метод onDestroyView().

FragmentTransaction заменить

Что касается вашего вопроса на 2 и 4, я не уверен. Можете ли вы опубликовать больше кода, который записывается в logcat?