【发布时间】:2019-01-03 16:15:51
【问题描述】:
我有一个Car 类实现Parcelable:
public class Car implements Parcelable {
private long id;
private String model;
public Car(long id, String model) {
this.id = id;
this.model = model;
}
public String getModel() {
return model;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(this.id);
dest.writeString(this.model);
}
private Car(Parcel in) {
this.id = in.readLong();
this.model = in.readString();
}
public static final Creator<Car> CREATOR = new Creator<Car>() {
@Override
public Car createFromParcel(Parcel source) {
return new Car(source);
}
@Override
public Car[] newArray(int size) {
return new Car[size];
}
};
}
然后,我有一个包含汽车列表的Store 类,它还实现了Parcelable:
public class Store implements Parcelable {
private List<Car> carList = new ArrayList<>();
public List<Car> getCarList() {
return carList;
}
public void setCarList(List<Car> cars) {
carList = cars;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(this.carList);
}
private Store(Parcel in) {
in.readTypedList(carList, Car.CREATOR);
}
public static final Creator<Store> CREATOR = new Creator<Store>() {
@Override
public Store createFromParcel(Parcel source) {
return new Store(source);
}
@Override
public Store[] newArray(int size) {
return new Store[size];
}
};
}
在片段中,我尝试恢复名为 myStore 的 Store 实例,包括其中的汽车列表:
class MyFragment extends Fragment {
private Store myStore;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(MY_STORE)) {
myStore = savedInstanceState.getParcelable(MY_STORE);
// PROBLEM IS HERE:
// when runtime hit here, the restored myStore contains one car but has id with weird long value and null in model field. WHY?
} else {
// initialize myStore with car list (only one car)
Car myCar = new Car(1, "BMW X1");
List<Car> cars = new ArrayList<>();
cars.add(myCar);
myStore = new Store();
myStore.setCarList(cars);
}
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
if(myStore != null) {
outState.putParcelable(MY_STORE, myStore);
}
super.onSaveInstanceState(outState);
}
}
在MyFragment 中出现问题,代码尝试在onCreate() 中恢复myStore。在运行时,恢复的myStore 确实在列表中包含一辆汽车,但该列表中的汽车具有奇怪的长值(例如28429333427126393)和model 字段中的null。为什么?我做错了什么?如何恢复一个对象包含另一个对象的列表?
【问题讨论】:
-
我认为您的代码无法编译。
myStore = savedInstanceState.getString(MY_STORE)将失败,因为您将String分配给Store类型的字段。 -
谢谢,这只是我的错字,更新为
getParcelable(MY_STORE)
标签: android android-fragments parcelable