在我的代码中,我创建了一个卡类;我稍后在gridview中显示了一堆卡片。 在屏幕方向改变时,我正在丢失所有卡片;在我之前的问题中,我指出了正确的方向。
现在,我在Android文档和StackO中找到的是
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(...);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
some_int_var = savedInstanceState.getInt(...);
super.onRestoreInstanceState(savedInstanceState);
}
现在,我这样做好,因为Bundle对象有几个方法,如putString,Char等。原语加上字符串。但我的卡怎么样?它们是向量中的Card对象,因此我无法使用任何这些方法。
如何在不使用onRetainNonConfigurationInstance的情况下恢复该向量,也不会阻止活动重置?在Android文档中,如果要重新启动大量数据,建议执行此操作,但这不是我的情况。
答案 0 :(得分:5)
对于您自己的对象,您可以使用putParcelable()
要使您的对象可以使用,您应该实现Parcelable
并按照以下示例来实现它。
http://prasanta-paul.blogspot.nl/2010/06/android-parcelable-example.html
所以:
public class ParcelData implements Parcelable {
String name;
ParcelData (Parcel source) {
name = source.readString();
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
public class MyCreator implements Parcelable.Creator<ParcelData> {
public ParcelData createFromParcel(Parcel source) {
return new ParcelData(source);
}
public ParcelData[] newArray(int size) {
return new ParcelData[size];
}
}
}
答案 1 :(得分:4)
首先 - 你可以传递意图复杂的对象。
为什么这样做是为了让您的类实现Serializable
接口,或Parcelable
,
然后使用intent.getSerializableExtra(keyName);
或intent.getParcelableExtra();
Serializable
更容易实现(基本上声明你的类实现它就足够了)但是某些特定的类无法序列化,而实现Parcelable
需要更多的工作,但总是可行的。
其他选项 - 将您需要保存的数据保存在某些带有getter和setter的singeltone类中,以保存您想要保存的内容,并在代码中随时随地使用它:
使用onSaveInstanceState
方法保存数据,然后将其恢复为onRestoreInstanceState
方法。