Сохранять состояние фрагмента между действиями
Возможно ли сохранить Fragment
между действиями?
Предположим, что у меня есть Activity A
с фрагментом F_Left
, расположенным слева, и фрагмент F_Right
, расположенный справа. Если я хочу запустить новую активность и сохранить фрагмент F_Left
... как я могу это сделать?
Можно ли сохранить состояние фрагмента F_Left
между действиями?
Обратите внимание, что я хочу запустить новую активность, потому что Fragment F_Left
- мое меню приложения, а Fragment F_Right
полностью изменяет контекст пользовательских операций... и мое приложение имеет много операций, поэтому имеет смысл иметь операцию за операцию.
Я знаю, что его можно сохранить Fragment
в пределах Activity
, но поскольку Fragment
жизненный цикл тесно связан с контейнером Activity
, я не знаю, возможно ли это сохранить Fragment
состояние между действиями.
Ответы
Ответ 1
Если я хочу запустить новую активность и сохранить Fragment F_Left... как я могу это сделать?
Не запускайте новое действие.
Могу ли я сохранить состояние F_Left Fragment между действиями?
Не автоматически. Это не тот же фрагмент. Вы передавали бы данные между действиями для использования фрагментом не иначе, как без каких-либо фрагментов.
Ответ 2
Поскольку API-уровень 13 (HONEYCOMB_MR2
, июнь 2011 г.), вы можете сохранять и восстанавливать состояние фрагмента в разных действиях.
-
Чтобы сохранить состояние, используйте FragmentManager.saveFragmentInstanceState()
, указав ссылку Fragment
, состояние которой вы хотите сохранить, Fragment
должен быть прикреплен во время попытки сохранить его состояние.
-
Чтобы восстановить состояние, используйте Fragment.setInitialSavedState()
с возвращаемым значением, когда вы создаете тот же Fragment
.
myFragment = new MyFragment();
myFragment.setInitialSavedState(appState.getMyFragmentState());
fragmentManager.beginTransaction().add(R.id.container, myFragment).commit();
Вы можете сохранить объект SavedState
через действия, как и любой другой объект; один из способов заключается в подклассе Application
, как показано выше (appState
является экземпляром нашего подкласса).
Ответ 3
На основании вашего ответа на мой комментарий у меня есть несколько другой ответ. Возможно, это не лучший ответ в вашей конкретной ситуации, я позволю вам это решить.:)
Прямо сейчас вы объединяете свои фрагменты в действия, потому что это то, что имеет для вас смысл, но на самом деле вы, вероятно, можете рассматривать весь процесс как одно действие и использовать фрагмент транзакций, чтобы скрыть и показать (или создать и уничтожить) фрагменты по мере необходимости.
Поскольку вы не будете создавать и уничтожать действия, ваш фрагмент меню слева будет оставлен нетронутым, и у вас не будет никаких проблем с его пользовательским интерфейсом. Набор операций, которые вы хотите запустить (который, без сомнения, включает в себя всевозможные фрагменты справа), не нужно запускать в новом действии, но вам нужно будет найти способ управления логикой, необходимой для фрагмента транзакций (либо в вашей über-активности, либо в каком-то классе OperationsManager).
Я думаю, что это будет намного более гладко для пользователей вашего приложения, так как единственная активность просто остается запущенной - и вы меняете только те части, которые действительно нужно изменить.
Ответ 4
Чтобы потенциально ответить на ваш первоначальный вопрос, если вы отпустите другое действие, я верю, что вы можете сохранить свой фрагмент из своего первого действия, вызвав FragmentManager:: putFragment (...), когда вызывается onSaveInstanceState (...) и затем получить его позже, например in onCreate (...).
Однако я должен согласиться с ответом Марка D.
Кстати, я делаю что-то подобное в том, что у меня есть установка с двумя панелями, в которой левая панель фиксируется с несколькими параметрами с каждой опцией, вызывающей другой фрагмент в правой панели. Кроме того, выбор записи в правой панели может привести к замене правого фрагмента на другой.
Однако я принял подход, согласно которому левый фрагмент отвечает только за отображение и обработку ответов от непосредственного фрагмента, который появляется в правой панели. Кроме того, каждый правый фрагмент отвечает за "замену" себя новым фрагментом и обработкой результатов, отправленных обратно на него. Я использую setTargetFragment, getTargetFragment и вызывая целевой фрагмент метода onActivityResult для возврата результатов.
Для меня подход, который я принял, ничем не отличается от того, когда мое приложение работает на телефоне с одной панелью, в которой начальная активность опции знает только о действиях, которые она срабатывает, и впоследствии эти новые сжигают дальнейшие действия, которые они знать.
Следует отметить, что моя активность в моем приложении с двойной панелью не сильно отличается от загрузки фрагмента левой панели, и я не могу полностью понять необходимость того, чтобы одна активность когда-либо приходилась на управление сотнями фрагментов.