2010-07-03 98 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”。

相关问题