Предположим, я хочу заменить текущий фрагмент в одном представлении контейнера другим. Лучше заменить ...
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();
Один из способов сделать это более эффективным? Не могу найти много информации о том, когда использовать эти методы или как они влияют на жизненный цикл задействованных фрагментов. Спасибо!
android
android-fragments
Роберт Карл
источник
источник
Ответы:
Вам следует подумать о том, что вы планируете делать с фрагментом, чтобы решить, по какому пути следовать. Если вы используете FragmentTransaction, чтобы скрыть фрагмент, он все еще может находиться в рабочем состоянии своего жизненного цикла, но его пользовательский интерфейс был отсоединен от окна, поэтому он больше не отображается. Таким образом, вы можете технически по-прежнему взаимодействовать с фрагментом и повторно подключить его пользовательский интерфейс позже, когда это потребуется. Если вы замените фрагмент, вы фактически вытаскиваете его из контейнера, и он пройдет через все события разрыва в жизненном цикле (onPause, onStop и т. Д.), И если по какой-то причине вам снова понадобится этот фрагмент, вам придется вставьте его обратно в контейнер и дайте ему снова пройти всю свою инициализацию.
Если существует высокая вероятность того, что вам снова понадобится этот фрагмент, просто скройте его, потому что перерисовать его макет дешевле, чем полностью переинициализировать его.
источник
hide()
иshow()
сэкономим! Спасибо за это!Вы в основном ответили сами. Если вы хотите заменить (поэтому старый фрагмент больше не нужен), используйте,
replace()
если вы хотите временно скрыть его, тогда сделайтеhide()
.источник
Я использовал метод hide / Show в своей деятельности с 4 фрагментами, и это решило мое решение, но некоторое время случайным образом, когда я показываю свое диалоговое окно, он дает исключение с ошибочным токеном окна, когда я использовал метод добавления и замены, тогда исключение с плохим токеном не возникает, поэтому я думаю, что show / метод скрытия не идеален
источник