Saving/Restoring Android 屏幕旋转上的自定义 ArrayList?
Saving/Restoring custom ArrayList on Android screen rotate?
我有一个自定义的 MovieItems ArrayList,我想在屏幕旋转时保存和恢复它。我检查了这个 post - How to save custom ArrayList on Android screen rotate? - 并实施和调整了一些代码,但保存和恢复似乎对我不起作用。
1) 保存 ArrayList:
public List<MovieItem> mItems = new ArrayList<>();
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList(MOVIE_KEY, (ArrayList<? extends Parcelable>) mItems);
super.onSaveInstanceState(outState);
}
2) 恢复 ArrayList:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
{
mItems = savedInstanceState.getParcelableArrayList(MOVIE_KEY);
}
setRetainInstance(true);
......
}
3) 使 MovieItem class 可打包:
public class MovieItem implements Parcelable{
private static final long serialVersionUID = 1L;
private String mCaption;
private String mId;
private String mUrl;
private String plot;
private Double rating;
private String release_date;
private boolean favourite;
public MovieItem() {
}
protected MovieItem(Parcel in) {
mCaption = in.readString();
mId = in.readString();
mUrl = in.readString();
plot = in.readString();
release_date = in.readString();
favourite = in.readByte() != 0;
mTitle = in.readString();
}
public static final Creator<MovieItem> CREATOR = new Creator<MovieItem>() {
@Override
public MovieItem createFromParcel(Parcel in) {
return new MovieItem(in);
}
@Override
public MovieItem[] newArray(int size) {
return new MovieItem[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(mCaption);
out.writeString(mId);
out.writeString(mUrl);
out.writeString(plot);
out.writeDouble(rating);
out.writeString(release_date);
}
因为您有 setRetainInstance(true)
,Fragment
不是 destroyed/recreated 屏幕旋转。 Fragment
将在屏幕旋转后调用 onSaveInstanceState()
,但不会发生 onCreate()
部分。
使用单调对象来存储您的列表。
public 枚举 MySingleton {
实例;
私人 MySingleton() {
System.out.println("Here");
}
私有列表 mItems = new ArrayList<>();
public 列出 getItems(){
return 项;
}
}
以及从任何地方访问您的数组 MySingleton.INSTANCE.getItems()
您也可以尝试实现 onRestoreInstanceState() 方法。它在 onStart() 方法之后调用。你可以阅读它 onRestoreInstanceState
在清单中的相关 activity 标记中添加此行,activity 将自行处理旋转
android:configChanges="screenSize|orientation|screenLayout"
测试一下也许对你有帮助
我有一个自定义的 MovieItems ArrayList,我想在屏幕旋转时保存和恢复它。我检查了这个 post - How to save custom ArrayList on Android screen rotate? - 并实施和调整了一些代码,但保存和恢复似乎对我不起作用。
1) 保存 ArrayList:
public List<MovieItem> mItems = new ArrayList<>();
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList(MOVIE_KEY, (ArrayList<? extends Parcelable>) mItems);
super.onSaveInstanceState(outState);
}
2) 恢复 ArrayList:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
{
mItems = savedInstanceState.getParcelableArrayList(MOVIE_KEY);
}
setRetainInstance(true);
......
}
3) 使 MovieItem class 可打包:
public class MovieItem implements Parcelable{
private static final long serialVersionUID = 1L;
private String mCaption;
private String mId;
private String mUrl;
private String plot;
private Double rating;
private String release_date;
private boolean favourite;
public MovieItem() {
}
protected MovieItem(Parcel in) {
mCaption = in.readString();
mId = in.readString();
mUrl = in.readString();
plot = in.readString();
release_date = in.readString();
favourite = in.readByte() != 0;
mTitle = in.readString();
}
public static final Creator<MovieItem> CREATOR = new Creator<MovieItem>() {
@Override
public MovieItem createFromParcel(Parcel in) {
return new MovieItem(in);
}
@Override
public MovieItem[] newArray(int size) {
return new MovieItem[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(mCaption);
out.writeString(mId);
out.writeString(mUrl);
out.writeString(plot);
out.writeDouble(rating);
out.writeString(release_date);
}
因为您有 setRetainInstance(true)
,Fragment
不是 destroyed/recreated 屏幕旋转。 Fragment
将在屏幕旋转后调用 onSaveInstanceState()
,但不会发生 onCreate()
部分。
使用单调对象来存储您的列表。 public 枚举 MySingleton { 实例; 私人 MySingleton() { System.out.println("Here"); } 私有列表 mItems = new ArrayList<>(); public 列出 getItems(){ return 项; } }
以及从任何地方访问您的数组 MySingleton.INSTANCE.getItems()
您也可以尝试实现 onRestoreInstanceState() 方法。它在 onStart() 方法之后调用。你可以阅读它 onRestoreInstanceState
在清单中的相关 activity 标记中添加此行,activity 将自行处理旋转
android:configChanges="screenSize|orientation|screenLayout"
测试一下也许对你有帮助