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

117

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

    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();

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

Роберт Карл
источник
если я перейду к фрагменту B из фрагмента A, а затем вернусь к фрагменту A, как я могу убедиться, что событие жизненного цикла, такое как onCreateView, не вызывается на фрагменте A? найти фрагмент по тегу работает?
blackHawk

Ответы:

135

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

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

Дэвид С. Сент-Клер
источник
5
Для наших нужд инициализация фрагмента обходится довольно дорого, поэтому мы, вероятно, пойдем hide()и show()сэкономим! Спасибо за это!
Роберт Карл
2
Привет, когда вы говорите «Отсоединиться от окна», вы имеете в виду, что будет вызван обратный вызов onDetach ()? Я экспериментировал с этим, похоже, это не так.
GingerJim
вероятно, он имел в виду «отстраниться»; фрагмент также можно отсоединить / повторно прикрепить (дополнительно добавить / удалить, показать / скрыть)
comeGetSome
1
@Zainodis, у меня такая же проблема. Мое решение - сохранить скрытое состояние фрагмента в onSaveInstanceState () - savedInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); затем в onCreate () if (savedInstanceState! = null) вернет скрытое состояние, и если фрагмент скрыт, скройте его с транзакцией.
worawee.s
1
@ worawee.s Привет и спасибо за обновление :)! Я решил проблему некоторое время назад со своей стороны - мне действительно не нужно было скрывать / показывать и т. Д., Поэтому я полностью отказался от этого, и теперь я использую такие стандарты, как добавление / замена или действия с одним фрагментом в одной панели (в основном поток подробных сведений) , Для тех, кто все еще использует hide, ваше решение будет действительно полезным - и отказ от проверки saveInstance! = Null был одной из ошибок, которые я делал раньше.
AgentKnopf
5

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

Марцин Орловски
источник
В основном replace удаляет все. Я не смог найти подходящую hideAll :(
AlikElzin-kilaka
@ AlikElzin-kilaka В моем фрагменте действия 3 во всех трех фрагментах я извлекаю данные из сети, каким методом мне следует следовать
Мансух Ахир
0

Я использовал метод hide / Show в своей деятельности с 4 фрагментами, и это решило мое решение, но некоторое время случайным образом, когда я показываю свое диалоговое окно, он дает исключение с ошибочным токеном окна, когда я использовал метод добавления и замены, тогда исключение с плохим токеном не возникает, поэтому я думаю, что show / метод скрытия не идеален

Дишант Каватра
источник