2011-08-02 2 views
5

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

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

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

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

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

+1

Я бы предложил отладку сборника lib, чтобы узнать, что происходит. Какую версию совместимой библиотеки вы используете? Я использую r1 и избегаю r2, потому что есть хотя бы одна ошибка регрессии, при которой onDestroy не вызывается при замене фрагмента. – PJL

+0

Я использую r3, я буду искать более старую версию, чтобы узнать, помогает ли это. Любые предложения о том, как отлаживать совместимость lib? Я очень новичок в отладке Java. – rofer

+0

Просто попробуйте войти в один из методов совместимости lib, и вам будет предложено указать местоположение источников. – PJL

ответ

10

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

+1

Я столкнулся с той же проблемой. Дело в том, что вы не обязаны вызывать метод суперкласса, но фрагменты не будут сохранены, если вы этого не сделаете. Мне пришлось посмотреть исходный код библиотеки compability, чтобы понять это. – Malcolm

+1

@rofer Вам не нужно реализовывать onSaveInstanceState для setRetainInstance для работы? –

1

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

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

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