Как Android сохраняет состояние просмотра при отсоединении/присоединении фрагмента

У меня есть элемент управления хостом вкладок, который загружает вкладки с использованием фрагментов.

Каждый раз, когда вкладка переключается, она отсоединяет старый фрагмент и прикрепляет новый фрагмент.

Я заметил, что во время этого процесса вызывается метод OnCreateView, и что большая часть моего состояния теряется, поскольку он каждый раз воссоздает представление. Однако я заметил, что некоторое состояние просмотра, такое как значение текста редактирования, сохраняется при отсоединении/присоединении.

Мне интересно, как Android автоматически восстанавливает состояние, когда представление полностью уничтожается и воссоздается как новое представление. Значение Bundle saveInstanceState всегда равно нулю, когда я просто переключаю вкладки. Пакет saveInstanceState заполняется только тогда, когда я делаю что-то вроде поворота экрана.

насколько я могу судить, это восстановление состояния происходит непосредственно перед вызовом метода фрагмента onStart.


person craigrs84    schedule 16.10.2012    source источник


Ответы (2)


При присоединении и отсоединении фрагментов уничтожаются только представления, экземпляр фрагмента остается прежним.

Диспетчер фрагментов восстанавливает состояния представлений, которые имеют идентификаторы, а saveInstanceState имеет значение null.

В случае ротации фрагменты, вероятно, воссозданы вами где-то еще (в onCreate() активности?).

person Bartosz Filipowicz    schedule 05.12.2012
comment
Спасибо, я думаю, что часть, которую я упустил, заключается в том, что представление должно иметь идентификатор, чтобы оно сохраняло свое состояние. Я тестировал некоторые представления, которым не был назначен идентификатор. Однажды я понял, что все стало ясно. - person craigrs84; 18.01.2013

Когда фрагмент будет удален из окна (или заменен), его onSaveInstanceState(Bundle) (или onRestoreInstanceState(Bundle)). Это будет распространяться по иерархии фрагментов, восстанавливая предыдущее состояние.

person ahodder    schedule 16.10.2012