【问题标题】:Android: Error at passing a Parcelable object to another ActivityAndroid:将 Parcelable 对象传递给另一个 Activity 时出错
【发布时间】:2015-11-04 09:18:28
【问题描述】:

我正在尝试将一个对象从我的 MainActivity 传递给另一个对象。它有一个 ArrayList 类型的属性,但我不知道为什么。在 MainActivity 中,我使用对象的 toStringSystem.out.println() 来查看他有什么,我可以看到:

Incidente{name='Farola fundida', type='sin luz', street='falsa', streetNumber=123, city='Bilbao', contacts=[alguien1, alguien2]}

但是,当我在其他活动中收到它时,我又制作了一个 System.out.println() 并得到了这个:

Incidente{name='Farola fundida', type='sin luz', street='falsa', streetNumber=123, city='Bilbao', contacts=[, null]}

你能告诉我我做错了什么吗?

我的班级Incidente 代码是这样的:

public class Incidente implements Parcelable{

    String name;
    String type;
    String street;
    int streetNumber;
    String city;
    ArrayList<String> contacts;

    public Incidente(String name, String type, String street, int streetNumber, String city, ArrayList<String> contacts) {
        this.name = name;
        this.type = type;
        this.street = street;
        this.streetNumber = streetNumber;
        this.city = city;
        this.contacts = contacts;
    }


    protected Incidente(Parcel in) {
        name = in.readString();
        type = in.readString();
        street = in.readString();
        streetNumber = in.readInt();
        city = in.readString();
        contacts = in.createStringArrayList();
    }

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

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(type);
        dest.writeString(street);
        dest.writeInt(streetNumber);
        dest.writeString(city);
        dest.writeList(contacts);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public int getStreetNumber() {
        return streetNumber;
    }

    public void setStreetNumber(int streetNumber) {
        this.streetNumber = streetNumber;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public ArrayList<String> getContacts() {
        return contacts;
    }

    public void setContacts(ArrayList<String> contacts) {
        this.contacts = contacts;
    }

    @Override
    public String toString() {
        return "Incidente{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", street='" + street + '\'' +
                ", streetNumber=" + streetNumber +
                ", city='" + city + '\'' +
                ", contacts=" + contacts +
                '}';
    }

    public boolean equals (Incidente obj2)
    {

        if(this.getName().equals(obj2.getName()))
        {
            if(this.getType().equals(obj2.getType()))
            {
                if(this.getStreet().equals(obj2.getStreet()))
                {
                    if(this.getStreetNumber()== obj2.getStreetNumber())
                    {
                        if(this.getCity().equals(obj2.getStreetNumber()))
                        {
                            if(this.getContacts().equals(obj2.getContacts()))
                            {
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
}

这就是我发送对象的方式:

ArrayList<String> arrContactos=new ArrayList<String>();
arrContactos.add("alguien1");
arrContactos.add("alguien2");
Incidente inci = new Incidente("Farola fundida", "sin luz", "falsa", 123, "Bilbao", arrContactos);

Intent i = new Intent(this, DetalleIncidenteActivity.class);
i.putExtra("objeto",inci);

这就是我收到它的方式:

incidente=getIntent().getExtras().getParcelable("objeto");

【问题讨论】:

标签: java android arraylist parcelable


【解决方案1】:

来自createStringArrayList的文档:

从 当前使用 writeStringList(List) 写入的包裹 数据位置()。

因此,根据文档,您应该使用 writeStringList(List) 而不是 writeList

【讨论】:

    【解决方案2】:

    使用parcelabler生成

    public class Incidente implements Parcelable, Parcelable {
    
            String name;
            String type;
            String street;
            int streetNumber;
            String city;
            ArrayList<String> contacts;
    
            protected Incidente(Parcel in) {
                name = in.readString();
                type = in.readString();
                street = in.readString();
                streetNumber = in.readInt();
                city = in.readString();
                if (in.readByte() == 0x01) {
                    contacts = new ArrayList<String>();
                    in.readList(contacts, String.class.getClassLoader());
                } else {
                    contacts = null;
                }
            }
    
            @Override
            public int describeContents() {
                return 0;
            }
    
            @Override
            public void writeToParcel(Parcel dest, int flags) {
                dest.writeString(name);
                dest.writeString(type);
                dest.writeString(street);
                dest.writeInt(streetNumber);
                dest.writeString(city);
                if (contacts == null) {
                    dest.writeByte((byte) (0x00));
                } else {
                    dest.writeByte((byte) (0x01));
                    dest.writeList(contacts);
                }
            }
    
            @SuppressWarnings("unused")
            public static final Parcelable.Creator<Incidente> CREATOR = new Parcelable.Creator<Incidente>() {
                @Override
                public Incidente createFromParcel(Parcel in) {
                    return new Incidente(in);
                }
    
                @Override
                public Incidente[] newArray(int size) {
                    return new Incidente[size];
                }
            };
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多