Сохранять состояние фрагмента между действиями

Возможно ли сохранить 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 для возврата результатов.

Для меня подход, который я принял, ничем не отличается от того, когда мое приложение работает на телефоне с одной панелью, в которой начальная активность опции знает только о действиях, которые она срабатывает, и впоследствии эти новые сжигают дальнейшие действия, которые они знать.

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