2012-06-22 5 views
55

Я нахожу Фрагмент # setRetainInstance (true) запутанным. Здесь Javadoc, извлеченный из Android Developer API:Зачем использовать Fragment # setRetainInstance (boolean)?

общественных недействительные setRetainInstance (булевы сохраняют)

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

  • OnDestroy() не будет вызываться (но onDetach() будет по-прежнему, потому что фрагмент будучи отделен от своей текущей деятельности).
  • onCreate (Bundle) не будет вызываться, так как фрагмент не будет воссоздан.
  • onAttach (Activity) и onActivityCreated (Bundle) будет все еще называться.

Вопрос: Как вы, как разработчик использовать это, и почему он делает вещи проще?

+3

подобный вопрос с хорошей информацией: [Понимание setRetainInstance фрагмента (логический)] (http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) –

+1

'OnDestroy()' будет вызываться, если устройство является низким по памяти –

ответ

72

Как вы, как разработчик использования этого

вызовов setRetainInstance(true). Обычно я делаю это в onCreateView() или onActivityCreated(), где я его использую.

и почему все упрощается?

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

+0

@CommonsWare - Если вы создаете новый фрагмент в Activity и эта активность воссоздана, как избежать повторного создания нового фрагмента? – Neil

+4

@Neil: Посмотрите, существует ли фрагмент (например, 'findFragmentById()'). Не воссоздавайте его, если он существует. – CommonsWare

+0

@CommonsWare Если фрагмент немного тяжелый для просмотра и использования памяти, что, по-вашему, должен сделать хороший разработчик? –

41

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

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

+0

Отличный совет, спасибо. –

+0

это отличный момент. – StackOverflowed

+0

Ницца.Но что, если нам нужно их обновить? –

26

Добавил этот ответ очень поздно, но я подумал, что это сделает все более ясным. Скажи за мной. Когда setRetainInstance является:

FALSE

  • Фрагмент получает воссоздан по изменению конфигурации. Создается NEW INSTANCE.
  • Все жизненные методы вызывают при изменении конфигурации, в том числе onCreate() и onDestroy().

ИСТИНА

  • Фрагмент не получает воссозданный по изменению конфигурации. Используется ТОЖЕ ИНСТАНЦИЯ.
  • Все методы жизненного цикла вызываются при изменении конфигурации, APART FROM onCreate() и onDestroy().
  • Сохранение экземпляра не будет работать при добавлении в стопку.

Не забывайте, что вышеизложенное применимо к DialogFragments, а также к фрагментам.

+1

вы можете добавить ссылку на «Сохранение экземпляра не будет работать при добавлении в backstack. ? ' – nmxprime

+1

@nmxprime здесь: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) –

+1

Как восстановить состояние фрагмента, если оно было добавлено в back-stack? saveInstanceState имеет значение null, и я не могу использовать setRetainInstance ... –

Смежные вопросы