代码之家  ›  专栏  ›  技术社区  ›  jul

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

  •  34
  • jul  · 技术社区  · 16 年前

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

    onSaveInstanceState ?

    4 回复  |  直到 16 年前
        1
  •  58
  •   Maaalte    15 年前

    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
  •  3
  •   dsewtz    13 年前

    我知道“这个案子很冷”,但因为我是第一个找到这条线索的,当我在寻找完全相同的东西时(现在已经找到了答案):

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

    什么时候? onSaveInstance(Bundle outState) 你的主要活动被称为(你也可以强制这个) onPause Bundle b = new Bundle();

    然后调用(可能不是继承的,也不是重写的)自定义方法 onSaveInstance(Bundle b) 在您自己的类中使用新创建的Bundle b。 onSaveInstance(包扩展) )你的主要活动,打电话 outState.putBundle("StringClassAndInstanceName", b);

        3
  •  1
  •   Community Mohan Dere    9 年前

    this 回答。

    基本上你必须把它保存在 Bundle .

        4
  •  1
  •   Andrew Lee    7 年前

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

    对于活动,重写 方法。

        5
  •  1
  •   Jamil Hasnine Tamim    6 年前

    对于自定义类保存在 onSaveInstanceState JSON 字符串并用 Gson 转换。以下示例用于 Fragment Activity :

    对于活动:

    saveInstanceState :

    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 也。

    为了上课 :

     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)
                }
            }
        }