Я просто просмотрел документацию методов attach()
и detach()
для FragmentTransaction
:
attach()
: Повторно присоединить фрагмент после того, как он был ранее отсоединен от пользовательского интерфейса сdetach(Fragment)
. Это приводит к тому, что его иерархия представлений будет воссоздана, присоединена к пользовательскому интерфейсу и отображена.
Ну, что это значит?
В частности, я увидел пример:
mMapFragment = new MapFragment(); ft.beginTransaction(mMapFragment) .attach() .add(R.id.container, mMapFragment) .commit();
Я удалил attach()
и попробовал еще раз: я не заметил никакой разницы. Что делает attach
в этом примере? Какая разница по сравнению с этим:
ft.beginTransaction() .add(R.id.container, mMapFragment) .commit();
В случае, если вышеприведенный пример недостаточно хорош, чтобы показать разницу … Я просто хочу знать, когда нам нужно называть attach()
и detach()
явно? Было бы лучше, если бы вы могли объяснить разницу в отношении добавления / удаления / замены.
Я думаю, что лучше взглянуть на определение Detach и Remove in FragmentTransaction Documentation, чтобы понять, что происходит.
Отсоедините данный фрагмент от пользовательского интерфейса. Это то же самое состояние, что и при установке на задний стек: фрагмент удаляется из пользовательского интерфейса, однако его состояние все еще активно управляется менеджером фрагментов. Когда вы идете в это состояние, его иерархия взглядов уничтожается.
Удалите существующий фрагмент. Если он был добавлен в контейнер, его представление также удаляется из этого контейнера.
Отделив вас, вы уничтожите только фрагмент View, но сохраните его состояние в менеджере фрагментов. Однако, удалив, вы удалите фрагмент и его состояние из диспетчера фрагментов; Кроме того, он удалит представление фрагмента, если он был добавлен в контейнер пользовательского интерфейса. Таким образом, оба они уничтожают представление фрагмента, но detach сохраняет состояние фрагмента в менеджере фрагментов.
Теперь пришло время взглянуть на прикрепление и добавление.
Добавьте фрагмент в состояние активности. Этот фрагмент может также иметь свое представление (если Fragment.onCreateView возвращает ненулевой) в представление контейнера активности.
Повторно присоедините фрагмент после того, как он был ранее удален из пользовательского интерфейса с отсоединением (фрагмент). Это приводит к тому, что его иерархия представлений будет воссоздана, присоединена к пользовательскому интерфейсу и отображена.
После добавления фрагмента он будет добавлен в состояние активности, и его представление будет добавлено к определенному представлению контейнера. Но при добавлении ничего не будет отображаться, если фрагмент не был добавлен в пользовательский интерфейс. Он просто придает менеджеру фрагментов. Однако, если вид уже был добавлен в контейнер в пользовательском интерфейсе и отсоединен после этого, добавив его, он будет отображаться снова в контейнере. Наконец, вы можете использовать attach и detach, если хотите временно уничтожить фрагмент View и хотите отображать и строить свой взгляд на будущее, не теряя при этом своего состояния.