我创建了一个自定义类RestaurantList的实例来保存我的数据(从Web服务接收的餐馆数据列表作为json数据)。
如何将其保存在onSaveInstanceState
?
答案 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
转换将其还原。以下示例适用于Fragment
和Activity
:
活动:
对于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 方法。