Подтвердить что ты не робот

Фрагменты остаются после того, как активность убита и воссоздана

У меня есть FragmentActivity (Фрагменты поддержки), где я создаю фрагменты по коду и помещаю их в FrameLayouts. Пока все работает нормально. Теперь, если я оставлю приложение возвратом, все будет в порядке, пока система не будет убивать мою активность (или я делаю это с кнопкой остановки в DDMS). Если это произойдет, ничего не получится, и моя активность будет убита. onDestroy не называется.

Поэтому, когда я снова открываю свое приложение, все фрагменты все еще существуют, и я получаю NullPointerExeptions, потому что они пытаются выполнить свою работу. Фрагменты не должны существовать в этом состоянии приложения, так что проблема для меня.

Мне не нужны они в backStack, поэтому я не помещаю их туда и не могу вызвать popBackStack(), чтобы избавиться от них.

Как я могу reset мой FragmentManager в onCreate() или просто убедиться, что фрагменты также уничтожены?

4b9b3361

Ответ 1

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

  • Сохранить состояние фрагмента в onSaveInstanceState
  • Восстановить состояние - пакет savedState предоставляется фрагменту в нескольких методах (onCreate, onCreateView и т.д.)

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

Ответ 2

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

поддержка FragmentPagerAdapter содержит ссылку на старые фрагменты

и здесь

ViewPager и фрагменты - какой способ сохранить состояние фрагмента?

Я предполагаю, что проблема в том, что когда вы создаете активность, вы создаете и сохраняете фрагменты в некотором списке, а не в фрагменте menager. Когда активность создается снова, он также создает фрагмент, но менеджер фрагментов использует фрагмент, который был создан ранее. Таким образом, ваш фрагмент возвращает null для getActivity(), потому что этот фрагмент создан прежде, чем вы разместите приложение в фоновом режиме.

Ответ 3

Это может быть нормальным. Вместо того, чтобы создавать и уничтожать множество фрагментов, Android может поддерживать их. Это особенно происходит с ViewPagers.

Используете ли вы много вызовов getActivity() или вызовов, получающих контекст? Если это так, нуль проверяет вызов getActivity(), делая что-то простое, как

Activity activity = getActivity();
if ( activity == null )
{
   Log.w("activity null!", "This will cause a crash if you access this variable!");
}

Еще один совет - следить за AsyncTasks. Если у вас есть какие-либо из них, выполняемые в фоновом режиме, вам нужно будет отслеживать, активна или мертва. Я думаю, что проверки жизненного цикла были перенесены в более поздние версии Android, но вы также можете сохранить логический флаг onAttach() и onDetach().

Ответ 4

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

Итак, попробуйте использовать childFragmentManager вместо supportFragmentManager и посмотрите, исправляет ли он вашу проблему.