【问题标题】:Nested Class Parcelable [duplicate]嵌套类 Parcelable [重复]
【发布时间】:2017-05-04 06:08:32
【问题描述】:

我需要知道如何创建一个嵌套类Parcelable

当我创建一个嵌套类时,我收到一个错误(它需要包裹作为参数。)

代码:

public class BookingDetailsItem implements Parcelable {
    private ServiceProviderItem serviceProvider;

    public Appointment appointmentDetails;
    private String notes;

    public BookingDetailsItem(ServiceProviderItem serviceProvider)
    {
        this.serviceProvider = serviceProvider;
        appointmentDetails = new Appointment();  // here it requires the parcel as required parameter
    }

    protected BookingDetailsItem(Parcel in) {
        serviceProvider = in.readParcelable(ServiceProviderItem.class.getClassLoader());
        appointmentDetails = in.readParcelable(Appointment.class.getClassLoader());
        notes = in.readString();
    }

    public static final Creator<BookingDetailsItem> CREATOR = new Creator<BookingDetailsItem>() {
        @Override
        public BookingDetailsItem createFromParcel(Parcel in) {
            return new BookingDetailsItem(in);
        }

        @Override
        public BookingDetailsItem[] newArray(int size) {
            return new BookingDetailsItem[size];
        }
    };

    public String getNotes() {
        return notes;
    }

    public void setNotes(String notes) {
        this.notes = notes;
    }

    @Override
    public int describeContents() {
        return hashCode();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(serviceProvider, flags);
        dest.writeParcelable(appointmentDetails, flags);
        dest.writeString(notes);
    }

    public static class Appointment implements Parcelable {
        private boolean isPickup;
        private Date servicingDate; // servicing date and time. In case of pickup, it will  be pick up date and time.

        private String additionalRequirements;

        protected Appointment(Parcel in) {
            isPickup = in.readByte() != 0;
            additionalRequirements = in.readString();
        }

        public static final Creator<Appointment> CREATOR = new Creator<Appointment>() {
            @Override
            public Appointment createFromParcel(Parcel in) {
                return new Appointment(in);
            }

            @Override
            public Appointment[] newArray(int size) {
                return new Appointment[size];
            }
        };

        public boolean isPickup() {
            return isPickup;
        }

        public void setPickup(boolean pickup) {
            isPickup = pickup;
        }

        public Date getServicingDate() {
            return servicingDate;
        }

        public void setServicingDate(Date servicingDate) {
            this.servicingDate = servicingDate;
        }

        public String getAdditionalRequirements() {
            return additionalRequirements;
        }

        public void setAdditionalRequirements(String additionalRequirements) {
            this.additionalRequirements = additionalRequirements;
        }

        @Override
        public int describeContents() {
            return hashCode();
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeByte((byte) (isPickup ? 1 : 0));
            dest.writeString(additionalRequirements);
        }
    }
}

【问题讨论】:

    标签: java android inner-classes parcelable


    【解决方案1】:

    出现该错误是因为Appointment 没有无参数构造函数。要解决这个问题,只需添加一个无参数构造函数:

    public Appointment() {}
    

    “为什么在我实施 Parcelable 之前这项工作有效?”你可能会问。这是因为如果一个类没有构造函数,则会自动隐式地为您添加一个无参数构造函数。所以在你添加了带有in参数的构造函数后,原来的无参数构造函数就丢失了。

    【讨论】:

    • 很好的解释......
    猜你喜欢
    • 2011-08-15
    • 2016-01-09
    • 1970-01-01
    • 2015-08-28
    • 2012-08-13
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多