Сохранить состояние фрагмента между операциями - PullRequest
15 голосов
/ 17 мая 2011

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

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

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

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

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

Ответы [ 4 ]

34 голосов
/ 17 сентября 2012

Начиная с уровня 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 - это экземпляр нашего подкласса).

4 голосов
/ 18 мая 2011

Исходя из вашего ответа на мой комментарий, у меня немного другой ответ. Это может оказаться не лучшим ответом в вашей конкретной ситуации, я позволю вам решить это. :)

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

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

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

3 голосов
/ 17 мая 2011

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

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

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

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

2 голосов
/ 19 мая 2011

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

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

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

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

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

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

...