setRetainInstance не работает для ListFragment при использовании библиотеки совместимости - PullRequest
5 голосов
/ 02 августа 2011

Я пытаюсь сохранить подкласс ListFragment при изменении ориентации, поэтому я добавил setRetainInstance (true) в конец моей функции onCreate. Я добавил метод onSaveInstanceState, чтобы добавить все его данные в пакет, а затем добавил код в onActivityCreated для загрузки этих данных обратно. К сожалению, это не сработает.

Когда я добавил несколько сообщений отладки с помощью Log.d, я обнаружил, что не только onSaveInstanceState не вызывается, но и onCreate (что, как представляется, в документации не должно происходить, когда retainInstance имеет значение true). Ни onCreate, ни onActivityCreated не имеют пакетов с моими данными (не удивительно).

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

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

Обновление: onDestroy не вызывается, когда я меняю ориентацию (что и должно быть), поэтому кажется, что некоторые из setRetainInstance работают

Ответы [ 2 ]

10 голосов
/ 05 августа 2011

Я наконец понял, в чём была моя проблема. Все сводилось к одной строке, которую я забыл добавить. В моем подклассе FragmentActivity я бы переопределил onSaveInstanceState, но я никогда не вызывал super.onSaveInstanceState. Очевидно, в отличие от других методов, чьи родители я забыл вызвать, onSaveInstanceState не будет выдавать ошибку времени выполнения, когда я забуду вызвать версию родительских классов, вместо этого setRetainInstance просто перестанет работать. Я надеюсь, что это спасет кого-то от головной боли, через которую я прошел, пытаясь решить эту проблему.

1 голос
/ 13 декабря 2011

Кажется, когда вы устанавливаете setRetainInstance = true, когда вызываются и onSaveInstanceState(), и onActivityCreated(), Bundle не будет возвращено.

Однако, поскольку ListFragmentсохраняя его, вы можете просто сохранить его состояние в поле и обработать его внутри onActivityCreated().

Помните, что Activity все равно будет уничтожен и воссоздан.

...