Как сохранить состояние при изменении ориентации в Android, если состояние сделано из моих классов?



Я смотрел на то, как Android обрабатывает изменение ориентации для моего приложения (я обнаружил, что он перезапускает mainactivity при изменении ориентации. Я видел, что вы можете переопределить метод



protected void onSaveInstanceState(Bundle outState)


чтобы сохранить материал, а затем иметь в onStart. Проблема в том, что у меня есть мое представление с пользовательскими объектами и listview с помощью пользовательского адаптера. Все находится в ArrayList этих объектов, но я заметил, что вы не можете поместить произвольные объекты в пакет! Так как же мне сэкономить государство?

373   5  

5 ответов:

EDIT: на более новых версиях Android и с библиотекой совместимости, сохранить фрагменты обычно лучший способ справиться с сохранением дорогих для воссоздания данных в процессе уничтожения/создания активности. И как указала Диана, сохранение неконфигурированных данных было для оптимизации таких вещей, как создание миниатюр, которые приятно сохранять по соображениям производительности, но не критично для функционирования вашей деятельности, если их нужно переделать - это не замена для правильного сохранения и восстановления состояния активности.

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

вы пробовали использовать: его работа вокруг,

<activity name= ".YourActivity" android:configChanges="orientation|screenSize"/>

в файле манифеста?

Он не работает по умолчанию , потому что при изменении ориентации onCreate будет вызван снова, и он перерисовывает ваше представление.

Если вы пишете этот параметр не нужно обрабатывать в деятельности, структура будет заботиться об остальных вещах. Он сохранит состояние экрана или макета при изменении ориентации.

Примечание если вы не при использовании другого макета для ландшафтного режима, при добавлении этих параметров макет для ландшафтного режима вызываться не будет.

иначе и другой способ

во-первых, вам нужно определить, что на самом деле "состояние" в вашем приложении. Вы не сказали, что вы на самом деле делаете, но позвольте мне предположить, что ArrayList объектов-это состояние, с которым работает пользователь.

во-вторых, решить, что жизненный цикл этого государства на самом деле. Это действительно связано с этой деятельностью? Или пользователь не должен потерять его, если говорят, что их батарея разряжается, устройство выключается, и они позже возвращаются в ваше приложение? Если первое, то onSaveInstanceState() правильно; если второе, вы хотите сохранить в постоянное хранилище в onPause().

на onSaveInstanceState() с помощью пользовательских объектов ключ должен реализовать Parcelable интерфейс. Это включает в себя реализацию методов на Parcelable, а также создание статического объекта CREATOR в вашем классе. Вот код для типичного простого Parcelable класс:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/ComponentName.java

ключевыми функциями являются Parcelable реализация:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/ComponentName.java#317

и создатель статики класс:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/ComponentName.java#355

(статический!--4--> и readFromParcel() просто удобства, которые были сделаны для этого класса и не требуется.)

теперь, когда у вас есть это, вы можете поместить весь свой ArrayList объектов в сохраненный пакет состояний с помощью Bundle.putParcelableArrayList:

http://developer.android.com/reference/android/os/Bundle.html#putParcelableArrayList(java.lang.String-Ява.утиль.ArrayList)

на Activity.onCreate(), проверьте, есть ли у вас savedState Bundle, и если это так, попробуйте извлечь ArrayList из этого и использовать его, если он найден, создав новый адаптер и представление списка для нового действия, которые используются для его отображения.

но я заметил, что вы не можете поместить произвольные объекты в комплекте!

сначала сделайте свои пользовательские объекты Parcelable.
Затем вы можете положить их в пучок.

все находится в ArrayList этих объектов

можно использовать putParcelableArrayList метод в пакете для хранения ArrayList пользовательских "parcelable" объектов.

запишите свои объекты в строки JSON с помощью Gson Google, а затем сохраните их как строку. Затем создайте их обратно из сохраненных строк JSON при перестроении Activity / Fragment

import com.google.gson.Gson;

public class MyClass {
    private int a;
    private String s;
    private OtherSerializableClass other;
    private List<String> list;

    public String toJson() {
        return new Gson().toJson(this);
    }

    public static ChatAPI_MessagesArray fromJson(String json){
       return new Gson().fromJson(json, YourClass.class);
    }

    // Getters
    ...

    // Setters
    ...
}

Comments

    Ничего не найдено.