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

Можно ли сохранить Fragment между действиями?

Допустим, у меня есть Activity A с Fragment F_Left расположенным слева, и Fragment F_Right расположенным справа. Если я хочу запустить новую активность и сохранить Fragment F_Left … как я могу это сделать?

Могу ли я сохранить состояние Fragment F_Left между действиями?

Обратите внимание, что я хочу запустить новую активность, потому что Fragment F_Left – это мое меню приложений, а Fragment F_Right полностью меняет контекст пользовательских операций … и мое приложение имеет много операций, поэтому имеет смысл иметь действие за операцию.

Я знаю, что его можно сохранить Fragment в рамках Activity , но так как жизненный цикл Fragment тесно связан с контейнером. Activity Я не знаю, возможно ли это сохранить состояние Fragment между действиями.

Если я хочу запустить новую активность и сохранить Fragment F_Left … как я могу это сделать?

Не запускайте новое действие.

Могу ли я сохранить состояние Fragment F_Left между действиями?

Не автоматически. Это не тот же fragment. Вы передавали бы данные между действиями для использования fragmentом не иначе, как без каких-либо fragmentов.

Начиная с уровня API 13 ( HONEYCOMB_MR2 , июнь 2011), вы можете сохранять и восстанавливать состояние fragmentа в разных действиях.

  • Чтобы сохранить состояние, используйте FragmentManager.saveFragmentInstanceState() , указав ссылку на Fragment , состояние которого вы хотите сохранить. Fragment должен быть прикреплен во время попытки сохранить его состояние.

  • Чтобы восстановить состояние, используйте Fragment.setInitialSavedState() с возвращаемым значением, когда вы создаете тот же Fragment .

     myFragment = new MyFragment(); myFragment.setInitialSavedState(appState.getMyFragmentState()); fragmentManager.beginTransaction().add(R.id.container, myFragment).commit(); 

Вы можете сохранить объект SavedState через действия, как и любой другой объект; одним из способов является подclass Application как показано выше ( appState является экземпляром нашего подclassа).

Основываясь на вашем ответе на мой комментарий, у меня есть несколько другой ответ. Возможно, это не лучший ответ в вашей конкретной ситуации, я позволю вам это решить. 🙂

Прямо сейчас вы объединяете свои fragmentы в действия, потому что это то, что имеет смысл для вас, но на самом деле вы, вероятно, можете рассматривать весь процесс как одно действие и использовать операции fragmentа, чтобы скрыть и показать (или создать и уничтожить) fragmentы по мере необходимости.

Поскольку вы не будете создавать и уничтожать действия , ваш fragment меню слева будет оставлен нетронутым, и у вас не будет никаких проблем с его пользовательским интерфейсом. Набор операций, которые вы хотите запустить (который, без сомнения, включает в себя всевозможные fragmentы справа), не нужно запускать в новом действии, но вам нужно будет найти способ управления логикой, необходимой для fragmentа транзакций (либо в вашей über-активности, либо в каком-то classе OperationsManager).

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

Чтобы потенциально ответить на ваш первоначальный вопрос, если вы отпустите другую активность, я считаю, что вы можете сохранить свой fragment из своего первого действия, вызвав FragmentManager :: putFragment (…), когда вызывается onSaveInstanceState (…), а затем получает его назад позже, например, в onCreate (…).

Однако я должен согласиться с ответом Марка Д.

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

Тем не менее, я принял подход, согласно которому левый fragment отвечает только за отображение и обработку ответов от непосредственного fragmentа, который появляется в правой панели. Кроме того, каждый правый fragment отвечает за «замену» себя новым fragmentом и обработкой результатов, отправленных обратно на него. Я использую setTargetFragment, getTargetFragment и вызывая метод onActivityResult целевого fragmentа для передачи результатов назад.

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

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

Давайте будем гением компьютера.