Android — Honeycomb — фрагменты вкладки панели действий сохраняют / восстанавливают состояние

#android

#Android

Вопрос:

В документах говорится, чтобы убедиться, что вы сохраняете состояние фрагмента при использовании вкладок с панелью действий, чтобы при переключении вкладок фрагмент выглядел так, как раньше. Как это делается? Используя пример для обработки вкладок, onSavedInstanceState не вызывается при переключении вкладки, так где бы мне сохранить состояние? Делаю ли я это на уровне активности? Я только хочу, чтобы состояние было временным.

Спасибо

Ответ №1:

Fragment.onSaveInstanceState() — подходящее место. Это будет вызвано, когда состояние необходимо сохранить. Если он не вызывается, его пока не нужно сохранять.

Комментарии:

1. У меня это не работает. Если вы используете примерный способ обработки вкладок, менеджер фрагментов удаляет фрагмент, когда вы отменяете выбор вкладки, и добавляет фрагмент, когда вы выбираете вкладку. Если у вас есть ListFragment, когда вы возвращаетесь на его вкладку, он даже не помнит, где в списке вы были. До версии 3.0, если у вас были действия на вкладках, их состояние запоминалось системой. Я пытаюсь сделать то же самое в HC, но onSavedInstanceState не вызывается.

2. Состояние onSaveInstance вызывается только в том случае, если фрагмент полностью удален. Например, если вы измените ориентацию экрана. Если вы хотите сохранить что-либо в тот момент, когда вкладка удаляется из макета, перезапишите паузу во фрагменте, который отображается, если вкладка выбрана.

3. Как мне получить обновленный пакет для прохождения через блок onActivityCreated, если я сохраню его в onPause — я не могу вызвать setArgument, потому что фрагмент все еще активен

4. Вы сохраняете свои данные в onSaveInstanceState (), чтобы получить их обратно при последующем создании. Если ваш фрагмент не создается заново, там находится тот же объект, так что вы можете просто использовать свои переменные-члены.

5. Каков был бы правильный способ восстановления состояния фрагмента при переключении между вкладками с минимальной поддержкой Android до уровня API12? Платформа As level версии v3.1 не имеет таких методов, как FragmentTransaction. Восстанавливать / отсоединять фрагменты?! onSaveInstanceState() не вызывается при переключении вкладки.

Ответ №2:

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

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

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