在屏幕方向更改时恢复对象

时间:2012-08-10 11:13:40

标签: android reset screen-orientation

在我的代码中,我创建了一个卡类;我稍后在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文档中,如果要重新启动大量数据,建议执行此操作,但这不是我的情况。

2 个答案:

答案 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方法。