2010-07-03 51 views

回答

51

自定義對象在實現接口Parcelable時可以保存在Bundle內。

@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(); 
    } 
} 
+3

我發現從JSON轉換回來的工作量較少,相比之下 – Arcantos 2016-08-04 22:06:53

+0

onSaveInstanceState應該在函數的末尾! https://developer.android.com/training/basics/activity-lifecycle/recreating.html – 2016-09-28 20:08:00

+0

儘管這是將自定義對象保存在onSaveInstanceState()中的正確方法,但應確保不使用此方法保存大對象。這只是爲了保存屏幕的狀態。如果對象變大,則有可能發生'TransactionTooLargeException'異常 – abat 2017-04-27 10:07:26

1

檢查this答案。

基本上你必須將它保存在Bundle之內。

+0

好的,謝謝,也許我還不夠清楚。我想知道的是如何保存一個* custom *對象。我發現我可以讓它變成可以理解的。 – jul 2010-07-04 10:57:49

3

我知道「這起案件是冷」,但因爲我發現這個線程首先,當我搜索完全相同的東西時(現在找到了答案):

想象一下Bundle是一個XML文件。 如果您創建新的<BUNDLE name="InstanceName" type="ClassName"> ,則可以在新的空白名稱空間中自由添加元素和屬性。

當你的MainActivity的onSaveInstance(Bundle outState)被稱爲(你也可以強制這),你可以創建一個新的:Bundle b = new Bundle();

然後打電話給你的(可能不是繼承和未覆蓋)自定義的方法onSaveInstance(Bundle b)在自己的類與您新創建的捆綁b。 那麼你MainActivity的(在onSaveInstance(Bundle outState)),撥打outState.putBundle("StringClassAndInstanceName", b);

當你發現這個字符串中的onCreate,你可以使用一個開關/箱重新創建該對象或(更好)已經於您的自定義類工廠功能工作與Bundle和「StringClassAndInstanceName」。

相關問題