Подтвердить что ты не робот

Как сохранить экземпляр пользовательского класса в onSaveInstanceState?

Я создал экземпляр пользовательского класса RestaurantList для хранения моих данных (список данных ресторана, полученных от веб-службы как данные json).

Как сохранить его в onSaveInstanceState?

4b9b3361

Ответ 1

Пользовательские объекты могут быть сохранены внутри Bundle, когда они реализуют интерфейс Parcelable. Затем их можно сохранить с помощью:

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("key", myObject);
    }

В основном в файле класса должны быть реализованы следующие методы:

 public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     /** save object in parcel */
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };

     /** recreate object from parcel */
     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

Ответ 2

Я знаю, что этот случай холоден, но потому, что я нашел этот поток первым, когда я искал точно то же самое (и нашел ответ уже):

Представьте Bundle как XML файл. Если вы создадите новый <BUNDLE name="InstanceName" type="ClassName"> вы можете свободно добавлять элементы и атрибуты в новое и пустое пространство имен.

Когда вызывается onSaveInstance(Bundle outState) вашего MainActivity (вы также можете заставить это в onPause), вы можете создать новое: Bundle b = new Bundle();

Затем вызовите свой (возможно, не унаследованный и не перегруженный) пользовательский метод onSaveInstance(Bundle b) в своем собственном классе с помощью только что созданного Bundle b. Затем (в onSaveInstance(Bundle outState)) вашего MainActivity вызовите outState.putBundle("StringClassAndInstanceName", b);

Когда вы найдете эту строку в onCreate, вы можете либо использовать переключатель /case для воссоздания этого объекта, либо (лучше) иметь функцию factory в вашем пользовательском классе для работы с Bundle и "StringClassAndInstanceName".

Ответ 3

Отметьте этот ответ.

В основном вы должны сохранить его внутри Bundle.