android - 使用 Parcelable 在 Activity 之间传递高度嵌套的类

标签 android parcelable

假设我想在 Intent 中存储类型为 MyObject 的自定义对象。这样做的方法是让 MyObject 实现 Parcelable。如果 MyObject 的字段之一也是 Widget 类型的自定义对象,显然要做的是让 Widget 实现 Parcelable 也是。

问题是在实现 Parcelable 时涉及大量样板文件。你可以通过不让 Widget 实现 Parcelable 来解决这个问题,而是只给它一个构造函数来获取一个 Parcel 和一个方法 writeToParcel如下:

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);
    }
}

然后您可以在 Parcelable 对象中有一个 Widget 字段,如下所示:

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];
        }
    };
}

这是一种可接受的方法吗?在一个项目中有许多自定义类可以写入和读取 Parcel 而无需它们实际实现 Parcelable 是否被认为是单一的 android?或者我正在使用 Parcelable 传递具有许多自定义类型字段的复杂对象(这些字段又具有许多自定义类型字段等)这一事实表明我不应该使用 Parcelable 首先?

最佳答案

我愿意(也确实)选择 Parceler:https://github.com/johncarl81/parceler

Parceler is a code generation library that generates the Android Parcelable boilerplate source code. No longer do you have to implement the Parcelable interface, the writeToParcel() or createFromParcel() or the public static final CREATOR. You simply annotate a POJO with @Parcel and Parceler does the rest.

它真的很容易使用。

关于android - 使用 Parcelable 在 Activity 之间传递高度嵌套的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897220/

相关文章:

android - 从数据库中删除后刷新 ListView

android - 使用 Crashlytics SDK 时如何在发生崩溃时进行回调?

Android:EditText 不允许带有 Next 软键的特殊字符

android - 适用于 Android 的 STL Vector、deque 或容器?

java - Android - 如何保持按钮被单击(选定)?

java - 将对象数据写入包裹

android - 在 Android 中使用 Serializable 不好吗?

android - 迁移到新的 kotlin-parcelize

android - 将自定义对象的数组列表传递给另一个 Activity

android - 使 String 之类的类可打包?