Фрагменты Android: когда использовать скрыть/показать или добавить/удалить/заменить?

Предположим, что я хочу заменить текущий фрагмент в виде контейнера другим. Лучше использовать замену...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... или следующие, с показом и скрытием?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

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

Ответ 1

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

Если есть большая вероятность, что вам понадобится этот фрагмент снова, просто спрячьте его, потому что это менее дорогостоящая операция, чтобы перерисовать его макет, чем полностью переинициализировать его.

Ответ 2

Вы в основном ответили сами. Если вы хотите заменить (так что старый фрагмент больше не нужен) используйте replace(), если вы хотите временно скрыть его, а затем hide().