假設我想將MyObject
類型的自定義對象存儲在Intent
中。做到這一點的方法是使MyObject
實施Parcelable
。如果MyObject
的其中一個字段也是Widget
類型的自定義對象,則明顯的做法是使Widget
也實現Parcelable
。使用Parcelable在活動之間傳遞高度嵌套的類
問題在於執行Parcelable
時涉及大量的樣板文件。
public final class Widget {
private final int a;
private final String b;
Widget(Parcel in) {
a = in.readInt();
b = in.readString();
}
void writeToParcel(Parcel out) {
out.writeInt(a);
out.writeString(b);
}
}
然後,您可以有一個Widget
場在Parcelable
對象,如下所示:您可以通過不使Widget
實施Parcelable
而只是給它一個構造採取Parcel
和方法writeToParcel
如下解決這個
public class MyObject implements Parcelable {
private final int x;
private final Widget w;
MyObject(int x, Widget w) {
this.x = x;
this.w = w;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(x);
w.writeToParcel(out);
}
public static final Parcelable.Creator<MyObject> CREATOR
= new Parcelable.Creator<MyObject>() {
@Override
public MyObject createFromParcel(Parcel in) {
return new MyObject(in.readInt(), new Widget(in));
}
@Override
public MyObject[] newArray(int size) {
return new MyObject[size];
}
};
}
這是一個可以接受的方法嗎?是否認爲unidiomatic android有一個項目中的許多自定義類,可以寫入並從Parcel
s中讀取而無需實際執行Parcelable
?或者,我正在使用Parcelable
來傳遞具有許多自定義類型字段的複雜對象(這又有許多自定義類型字段等),這一事實表明我不應該首先使用Parcelable
?
不幸的是,這僅僅是一個例子。我認爲我的物體實際上是4-5層。 –
非正統的做法是如果你有一個靜態字段的類,你可以在活動之間進行更新。 例如**活動A **將在開始**活動B **的意圖之前更新靜態類中的MyObject'字段,然後在**活動B **中它將從該活動B **中讀取「MyObject」字段靜態類。這樣,你根本不需要考慮可接受的包裹 –
@PaulBoddington look above –