Сохранить состояние активности (не только некоторые переменные) при изменении ориентации - PullRequest
4 голосов
/ 17 декабря 2011

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


(см. Снимок экрана ниже). При запуске приложения

1) ScrollView видны элементы 1,2,3,4

2) данные таблицы, которые заполняются с помощью кнопки Гейнера.


Как показано на скриншотах ниже, Когда приложение работает в режиме ПОРТРЕТ , I

1) прокрутка вниз до ScrollView элемента 4,5,6

2) нажал кнопку Loser, соответственно изменились данные в таблице под кнопкой.

3) Я даже буду динамически менять содержимое графика (чего я еще не делал).


Теперь я переключаюсь в режим ЛАНДШАФТ так

1) ScrollView показывает элемент ScrollView 1,2,3,4

2) таблица показывает данные, которые заполняются при нажатии кнопки Гейнера.

3) график такой, какой он есть, поскольку я еще не изменил его (что я изменю позже).


Так что происходит, когда я меняю ориентацию, моя деятельность перезапускается. Поэтому, если пользователь выполняет какую-то задачу в одной ориентации и меняет ориентацию, весь прогресс будет потерян.

Я знаю, что мне нужно сохранить состояние активности и восстановить его при изменении ориентации. Но я не знаю, с чего начать и что экономить.

ЛЮБАЯ ПОМОЩЬ БУДЕТ ЖИЗНЕННОЙ!

Scrrenshot

1 Ответ

12 голосов
/ 17 декабря 2011

Опция # 1: переопределите onSaveInstanceState() вашего Activity и поместите любую информацию, которую вы хотите, в поставляемую Bundle. Ваш новый экземпляр действия получит это Bundle в onRestoreInstanceState() (или onCreate()). Вот пример проекта, демонстрирующего это .

Опция # 2: переопределить onRetainNonConfigurationInstance() вашего Activity и вернуть некоторый объект, представляющий ваше состояние. Ваш новый экземпляр действия может вызвать getLastNonConfigurationInstance() для извлечения этого объекта, поэтому новое действие может применить эту информацию. Однако будьте осторожны, чтобы старая активность не возвращала что-либо в объекте, который содержит ссылку на старую активность (например, виджет, экземпляр обычного внутреннего класса). Вот пример проекта, демонстрирующего это .

Вариант № 3: преобразовать это действие во фрагмент. Во время начальной настройки фрагмент должен вызвать setRetainInstance(true);. Добавьте фрагмент динамически к какой-либо деятельности через FragmentTransaction. Теперь, когда конфигурация изменяется, фрагмент сохраняется, поэтому все ваши виджеты и состояние сохраняются. Вот пример слишком сложного примера приложения, демонстрирующего это .

В настоящее время это три рекомендуемых подхода.

...