В какой ситуации мы хотим добавить фрагмент без контейнера?

В транзакции фрагмента добавлен метод (фрагмент фрагмента, тег String) , который не помещает фрагмент в контейнер, поэтому он не может иметь вид. Для чего его можно использовать?

Solutions Collecting From Web of "В какой ситуации мы хотим добавить фрагмент без контейнера?"

Из документации для Android:

Однако фрагмент не должен быть частью макета активности; Вы также можете использовать фрагмент без собственного пользовательского интерфейса в качестве невидимого работника для этой деятельности.

Как насчет этой цели?

Простой пример: Activity запускает AsyncTask , но когда перезагрузка устройства возобновляется, в результате чего AsyncTask теряет соединение с AsyncTask пользовательского интерфейса. Но это действие может содержать Fragment (невидимый, без интерфейса), который может обрабатывать всю работу AsyncTask . Когда Activity воссоздана, ОС Android заботится о повторном подключении Fragment , таким образом, потеря данных не произойдет.

Для Dialogs у вас нет контейнера на обычном уровне приложения. Он напрямую добавляется в Window с WindowManager (см. WindowManager.LayoutParams для различных типов слоев).

DialogFragment имеет API, такой как DialogFragment.html # show (android.app.FragmentManager, java.lang.String), который соответствует этому.

Как упоминает @Lucius Hipan, его можно использовать для предотвращения потери данных. Почти всегда этот король фрагментов используется как резервный контейнер (setRetainInstance (true), вызываемый методом onCreate), то после изменения конфигурации устройства (например, изменение ориентации) фрагмент не будет воссоздан, но запоминает предыдущее состояние. Рекомендуется использовать asynctask.

Вот пример:

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

Этот метод является хорошим компромиссом для небольших проектов, где использование библиотек шины является завышением.

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

Рекомендуется прочитать http://developer.android.com/guide/components/fragments.html .

Пример сохранения экземпляра: https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java

Кроме того, здесь есть похожие вопросы (так что эти вопросы, кажется, дублируются, но не могут быть отмечены из-за щедрости):

  • Что такое прецедент для фрагмента без пользовательского интерфейса?
  • Использование фрагментов без использования пользовательского интерфейса Android

Вызывая метод add(Fragment fragment, String tag) внутренне вызывает add(int containerId, Fragment fragment, String tag) с контейнером 0.It.That будет add(0, fragment, tag). Если 0 поставляется как containerId , он не будет размещен фрагментом в контейнере.