如何在onSaveInstanceState中保存自定义类的实例?

时间:2010-07-03 17:57:23

标签: android

我创建了一个自定义类RestaurantList的实例来保存我的数据(从Web服务接收的餐馆数据列表作为json数据)。

如何将其保存在onSaveInstanceState

5 个答案:

答案 0 :(得分:56)

自定义对象在实现接口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();
     }
 }

答案 1 :(得分:3)

我知道&#34;这个案子很冷&#34;但是因为我首先找到了这个帖子,当我正在寻找完全相同的东西时(现在找到答案):

想象一下Bundle是一个XML文件。 如果您创建新的<BUNDLE name="InstanceName" type="ClassName"> 您可以在新的空名称空间中自由添加元素和属性。

调用MainActivity的onSaveInstance(Bundle outState)时(您也可以在onPause中强制执行此操作),您可以创建新的:Bundle b = new Bundle();

然后使用新创建的Bundle b在您自己的类中调用您的(可能不是继承而不是覆盖)自定义方法onSaveInstance(Bundle b)。 然后(在[{1}})您的MainActivity中,拨打onSaveInstance(Bundle outState)

当您在onCreate中找到此字符串时,您可以使用switch / case重新创建此对象,或者(更好)在自定义类中使用工厂函数来使用Bundle和&#34; StringClassAndInstanceName&#34;。< / p>

答案 2 :(得分:1)

检查this回答。

基本上你必须将它保存在Bundle

答案 3 :(得分:1)

科特琳解决方案: 对于保存在onSaveInstanceState中的自定义类,您可以将您的类转换为JSON字符串,并通过Gson转换将其还原。以下示例适用于FragmentActivity

活动:

对于saveInstanceState中的put类:

override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        val gson = Gson()
        val json = gson.toJson(your_custom_class)
        outState.putString("CUSTOM_CLASS", json)
    }

还原类:

 override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    val json = savedInstanceState?.getString("CUSTOM_CLASS")
    if (!json!!.isEmpty()) {
        val gson = Gson()
        testBundle = gson.fromJson(json, Session::class.java)
    }
 }

您也可以在活动onCreate上将其还原。

对于片段:

对于saveInstanceState中的put类:

 override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        val gson = Gson()
        val json = gson.toJson(customClass)
        outState.putString("CUSTOM_CLASS", json)
    }

还原类:

 override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        if (savedInstanceState != null) {
            val json = savedInstanceState.getString("CUSTOM_CLASS")
            if (!json!!.isEmpty()) {
                val gson = Gson()
                val customClass: CustomClass = gson.fromJson(json, CustomClass::class.java)
            }
        }
    }

答案 4 :(得分:0)

自定义类对象可以转换为JSON并以字符串形式存储在分发包中。以下示例适用于片段。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Gson gson = new Gson();
    String json= gson.toJson(customClass);
    outState.putString("CUSTOM_CLASS", json);
}

public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if(savedInstanceState != null) {
        String json= savedInstanceState.getString("CUSTOM_CLASS");
        if(!json.isEmpty()) {
        Gson gson = new Gson();
            CustomClass customClass = gson.fromJson(json, CustomClass.class);
        }
    }
}

对于活动,请改用 onRestoreInstanceState 方法。