如何传递包含另一个 Parcelable 类列表的 Parcelable 类?

Posted

技术标签:

【中文标题】如何传递包含另一个 Parcelable 类列表的 Parcelable 类?【英文标题】:How to pass a Parcelable class which contains a list of another parcelable class? 【发布时间】:2021-07-10 23:24:05 【问题描述】:

我正在尝试将 Parcelable 类从一个 Activity 传递到另一个 Activity。我是这样做的:

Intent intent = new Intent(ClosedChatActivity.this, AdminProfileActivity.class);intent.putExtra("adminProfile", adminProfile);
startActivity(intent);

然后像这样在另一个 Activity 中获取它:

adminProfile = (AdminProfile) getIntent().getExtras().getParcelable("adminProfile");

这是 AdminProfile 类和它内部的 WebLink 类:

public class AdminProfile implements Parcelable 
    public static final Creator<AdminProfile> CREATOR = new Creator<AdminProfile>() 
        @Override
        public AdminProfile createFromParcel(Parcel in) 
            return new AdminProfile(in);
        

        @Override
        public AdminProfile[] newArray(int size) 
            return new AdminProfile[size];
        
    ;
    public Long idUser;
    public String name;
    public String professio;
    public String description;
    public List<WebLink> webLinks;
    public Long idOficina;

    protected AdminProfile(Parcel in) 
        idUser = in.readLong();
        name = in.readString();
        professio = in.readString();
        description = in.readString();
        webLinks = in.createTypedArrayList(WebLink.CREATOR);

        idOficina = in.readLong();
    

    @Override
    public int describeContents() 
        return 0;
    

    @Override
    public void writeToParcel(Parcel parcel, int i) 
        parcel.writeLong(idUser);
        parcel.writeString(name);
        parcel.writeString(professio);
        parcel.writeString(description);
        parcel.writeLong(idOficina);
        parcel.writeTypedList(webLinks);
    

public class WebLink implements Parcelable 
    public static final Creator<WebLink> CREATOR = new Creator<WebLink>() 
        @Override
        public WebLink createFromParcel(Parcel in) 
            return new WebLink(in);
        

        @Override
        public WebLink[] newArray(int size) 
            return new WebLink[size];
        
    ;
    public String name;
    public String url;

    protected WebLink(Parcel in) 
        name = in.readString();
        url = in.readString();
    

    @Override
    public boolean equals(@Nullable Object obj) 
        WebLink webLink = (WebLink) obj;
        assert webLink != null;
        return this.name.equals(webLink.name) && this.url.equals(webLink.url);
    

    @Override
    public int describeContents() 
        return 0;
    

    @Override
    public void writeToParcel(Parcel parcel, int i) 
        parcel.writeString(name);
        parcel.writeString(url);
    

当我得到对象时,其中的两个字符串与我发送的不同。这是为什么呢?

奇怪的是,我有另一个包含 AdminProfile 的 Parcelable 类,当发送该类时,它确实可以发送包含 Weblinks 的良好,但如果我只发送一个 AdminProfile,它会失败。

【问题讨论】:

删除了 android-studio 标签,因为该标签用于解决有关 Android Studio 产品的问题。您的问题是一个通用的 Android 问题,与 Android Studio 无关。 【参考方案1】:

在读写Parcelable类时,需要确保元素的顺序完全一致。

您正在编写idOficina,然后是WebLinks,但您正在以相反的顺序阅读它们。

【讨论】:

以上是关于如何传递包含另一个 Parcelable 类列表的 Parcelable 类?的主要内容,如果未能解决你的问题,请参考以下文章

将 parcelable 对象传递给新活动返回 null

如何使用包含 Hashmap 和 SparseArray 的自定义类实现 parcelable?

***Error关于为android中的类编写Parcelable

实现 Parcelable 接口时如何读/写布尔值?

Android 类 Parcelable 与 ArrayList

如何将不可打包的对象从活动传递到另一个活动?