Сохранение и восстановление состояния пользовательского интерфейса фрагмента при нажатии и выталкивании из заднего стека

Предыстория:

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

Основное отличие от сохранения стека действий заключается в том, что когда фрагмент помещается в задний стек и заменяется, он вызывает его onDestroyView(), но не onDestroy(), а когда он возвращается, его представление будет воссоздано с onCreateView(). (однако onCreate() не вызывается, так как объект фрагмента не удален)

В стеке действий этого не произойдет, и представления останутся.

Это имеет положительный эффект на недорогих устройствах, так как ОС Android может освободить немного памяти, и вам не нужно поддерживать правильные представления (в моем приложении сообщения с сервера могут изменить представление в любое время), поэтому можно сэкономить драгоценное пропускная способность, а также.

Настоящая проблема:

Допустим, у меня есть фрагмент, и пользователь нажимает на что-то, и его вид изменяется, например. список расширен.

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

Когда пользователь возвращается, фрагмент будет воссоздан и не будет «запоминать» изменения, внесенные пользователем, например. список не будет расширен, как следует

так как я могу сохранить состояние и восстановить его, не делая особых случаев для каждого представления?

Нежелательные ответы:

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

person ndori    schedule 23.06.2014    source источник
comment
возможный дубликат Как сохранить и восстановить состояние ExpandableListView в Android?   -  person Sufian    schedule 12.12.2014
comment
Tnx, но это не тот же вопрос, здесь я говорю об общем способе сохранения всего состояния фрагмента. В другом вопросе они говорят об одном виде представления и о том, как сохранить его особенность.   -  person ndori    schedule 17.12.2014
comment
Я не думаю, что вы можете сохранить все состояние фрагмента, но вы можете сохранить такие вещи, как положение прокрутки ListView, состояние кнопки/флажка и т. д. Я считаю, что это будет то, что вы хотите делать большую часть своего времени. Если для этого есть причина, упомяните об этом, и я надеюсь, что есть и другие способы.   -  person Sufian    schedule 17.12.2014
comment
@Sufian Да, я тоже так не думаю, мне не нужна специальная обработка для каждого представления во фрагменте, но, думаю, у меня нет другого выбора ... Странно, что у андроида есть механизм именно для этого ( onSaveInstanceState()), который воссоздает действия, но не для фрагментов...   -  person ndori    schedule 01.01.2015
comment
Вызываете ли вы .replace() при открытии нового фрагмента (с помощью addToBackstack)? Возможно, вместо .replace() вы могли бы вызвать .add() (с addToBackstack), и состояние фрагмента, к которому вы вернетесь, будет сохранено.   -  person Marko    schedule 01.01.2015
comment
@ndori восстановление состояния Activity мало чем отличается от восстановления Fragment, разница только в том, что вы восстанавливаете состояние Fragment в onActivityCreated().   -  person Sufian    schedule 01.01.2015