假设我想将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 –