У меня есть действие, содержащее фрагмент «список», который при нажатии на один из его элементов заменит себя на «контент». Когда пользователь использует кнопку «Назад», он снова возвращается к фрагменту «списка».
Проблема в том, что фрагмент находится в состоянии по умолчанию, независимо от того, что я пытаюсь сохранить данные.Как сохранить данные фрагмента после транзакций backstack?
факты:
- оба фрагмента созданы через
public static TheFragment newInstance(Bundle args)
,setArguments(args)
иBundle args = getArguments()
- оба фрагмента находятся на том же уровне, который находится непосредственно внутри
FrameLayout
от родительской активности (то есть, не вложенные фрагменты) - Я не хочу звонить
setRetainInstance
, потому что моя деятельность является потоком мастера/детализации, который имеет 2 панели на больших экранах. 7-дюймовые планшеты имеют 1 панель в портрете и 2 панели в ландшафте. Если я сохраню экземпляр фрагмента «список», он будет (я думаю) трахать вещи с поворотами экрана - , когда пользователи нажимают на элемент в списке «список», фрагмент, фрагмент «содержание» отображается через
FragmentTransaction#replace(int, Fragment, String)
, с тем же ID, но другим тегом - Я преимущественный
onSaveInstanceState(Bundle)
, но это не всегда называют каркасом, а per the doc: «есть много ситуаций, где фрагмент может быть в основном снесен (например, когда он помещен в задний стек без отображения пользовательского интерфейса), но его состояние не будет сохранено, пока его собственная деятельность не должна фактически сохранять свое состояние ». - Я использую библиотеку поддержки
От пули 5 выше, я думаю, что младшие устройства, которые необходимо восстановить память после операции фрагмента можно назвать Fragment#onSaveInstanceState(Bundle)
. Однако на моих тестовых устройствах (Galaxy Nexus и Nexus 7) инфраструктура не вызывает этот метод. Так что это неверный вариант.
Итак, как я могу сохранить некоторые данные фрагмента? пучок передан в Fragment#onCreate
, Fragment#onActivityCreated
и т. д. всегда null
.
Следовательно, я не могу изменить отличие от нового запуска фрагмента до восстановления заднего стека.
Примечание: возможно related/duplicate question
Прямо сейчас единственный вариант, который у меня есть: 'isFromBackStack = getActivity(). GetSupportFragmentManager(). GetBackStackEntryCount()> 0'. Я хотел бы, чтобы у меня было что-то более чистое, для меня это похоже на хак. Кроме того, я не получаю «Bundle» из предыдущего экземпляра фрагмента. –