Сохранить объект при изменении ориентации
Как сохранить объект при изменении ориентации, поскольку onRetainNonConfigurationInstance и getLastNonConfigurationInstance устарели. И что я не могу использовать с compatibility package
android-support-v4.jar
FragmentActivity
, где он показывает Cannot override the final method from FragmentActivity
сайт разработчика говорит
Вместо этого используйте новый API-интерфейс фрагмента setRetainInstance (boolean);
Но я не знаю, как сохранить пользовательский объект, используя setRetainInstance
Мой сценарий:
В моей деятельности у меня есть AsyncTask с диалоговом индикатором прогресса. Здесь мне нужно обработать изменение ориентации.
Для этого я получил очень хороший ответ от Марка Мерфи, CommonsWare
background-task-progress-dialog-orientation-change-is-there-any-100-working,
с пример проекта
Поскольку я использую пакет совместимости android-support-v4.jar, FragmentActivity
, я не могу переопределить onRetainNonConfigurationInstance
Невозможно переопределить конечный метод из FragmentActivity
Есть ли альтернативный метод для сохранения моего пользовательского объекта?
EDIT:
Я не могу выполнить задачу AsyncTask Parcelable (если я не ошибаюсь), поскольку она использует интерфейс, контекст и т.д.
Мой AsyncTask
public class CommonAsyncTask extends AsyncTask<Object, Object, Object> {
Context context;
AsyncTaskServices callerObject;
ProgressDialog progressDialog;
String dialogMessag ;
................
Я ищу, есть ли альтернативы метода onRetainNonConfigurationInstance, которые полностью сохраняют объект во время изменения ориентации и позже могут быть получены с помощью getLastNonConfigurationInstance
Ответы
Ответ 1
Существует две альтернативы:
- Используйте
Loader
. FragmentActivity
позаботится о сохранении/восстановлении его состояния при повторном создании.
- Используйте фрагмент без представления и вызывайте
setRetainInstance(true)
на нем. Вот пример этого в источнике библиотеки совместимости, FragmentRetainInstanceSupport или некоторых таких.
Ответ 2
Вы можете использовать onRetainCustomNonConfigurationInstance.
Используйте это вместо onRetainNonConfigurationInstance(). Получить позже с getLastCustomNonConfigurationInstance().
Ответ 3
Когда ваш фрагмент приостановлен, он вызовет этот метод:
@Override
public void onSaveInstanceState(Bundle outState) {
// Add variable to outState here
super.onSaveInstanceState(outState);
}
Затем переменная outState
будет передана в метод onCreate(), когда Фрагмент перезапустится.
Вы можете сохранить любые данные, которые являются базовыми, или реализует интерфейс Parcelable
Ответ 4
Ну, цитата из Android Developers' References
:
Этот метод вызывается после onStart(), когда активность повторно инициализируется из ранее сохраненного состояния, приведенного здесь в savedInstanceState. Большинство реализаций будут просто использовать onCreate (Bundle), чтобы восстановить их состояние, но иногда удобно делать это здесь после завершения инициализации или разрешить подклассам решать, использовать ли ваши настройки по умолчанию реализация. По умолчанию реализация этого метода выполняет восстановление любого состояния представления, которое ранее было заморожено onSaveInstanceState (Bundle).
Что касается использования onSaveInstanceState()
, лучше вернуть свои объекты/вещи, используя onRestoreInstanceState()
вместо этого.
Обратитесь к Activity # onRestoreInstanceState()