Parcelable替换字段对象的值?

问题描述 投票:0回答:1

我正在发送 Parcelable 对象 ArrayList<Contact> 从Activity1发送到Activity2。

在我真正发送对象到Activity2之前,我做了简单的 Log.i() 函数。它打印出来的是这样的。

I/String representation from Activity1: Contact{id=1, firstName='John', lastName='Doe', email='[email protected]', photoPath='/storage/emulated/0/Pictures/Screenshots/Screenshot_20200502-094346__02.jpg', note='some notes'}

在Activity2中,它打印出这样的结果:

I/String representation from Activity2: Contact{id=6, firstName='1', lastName='John', email='Doe', photoPath='[email protected]', note='/storage/emulated/0/Pictures/Screenshots/Screenshot_20200502-094346__02.jpg'}

Object is completely messed up. 因为我在db中只有一个对象,所以id不可能是6。对于其他字段,你可以自己看。

最后,这里是完整的 Contact 类。

public class Contact implements Parcelable{

    @SerializedName("id")
    @Expose
    private Integer id;

    @SerializedName("firstName")
    @Expose
    private String firstName;

    @SerializedName("lastName")
    @Expose
    private String lastName;

    @SerializedName("email")
    @Expose
    private String email;

    @SerializedName("photoPath")
    @Expose
    private String photoPath;

    @SerializedName("note")
    @Expose
    private String note;


    public Contact(){
        //photoPath = "";
    }

    public Contact(Integer id, String firstName, String lastName, String email, String photoPath, String note) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.photoPath = photoPath;
        this.note = note;
    }

    protected Contact(Parcel in) {
        id = in.readInt();
        firstName = in.readString();
        lastName = in.readString();
        email = in.readString();
        photoPath = in.readString();
        note = in.readString();

    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhotoPath() {
        return photoPath;
    }

    public void setPhotoPath(String photoPath) {
        this.photoPath = photoPath;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public String getPhotoFilename() {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        // Log.i("timestampe", timeStamp);
        return "IMG_" + getId() + "_" + timeStamp + ".jpg";
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {

        dest.writeStringArray(new String[]{this.id.toString(), this.firstName, this.lastName, this.email, this.photoPath, this.note});

        /*dest.writeString(this.id.toString());
        dest.writeString(this.firstName);
        dest.writeString(this.lastName);
        dest.writeString(this.email);
        dest.writeString(this.photoPath);
        dest.writeString(this.note);*/
    }

    public static final Parcelable.Creator<Contact> CREATOR= new Parcelable.Creator<Contact>() {
        @Override
        public Contact createFromParcel(Parcel source) {
             // TODO Auto-generated method stub
            return new Contact(source);  //using parcelable constructor
        }

        @Override
        public Contact[] newArray(int size) {
            // TODO Auto-generated method stub
            return new Contact[size];
        }

    };

    @Override
    public String toString() {
        return "Contact{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", photoPath='" + photoPath + '\'' +
                ", note='" + note + '\'' +
                '}';
    }
}

两种方法我都试过了 from writeToParcel(),不工作。

android android-intent android-activity parcelable
1个回答
1
投票

你的 writeToParcel() 需要完全符合你的 Contact(Parcel in) 做:如果您使用的是 readInt(),你需要使用 writeInt() 在完全相同的顺序。


0
投票

是的,伊恩,我确实像你在评论中建议。现在它的工作。谢谢你:)

protected Contact(Parcel in) {
    id = in.readInt();
    firstName = in.readString();
    lastName = in.readString();
    email = in.readString();
    photoPath = in.readString();
    note = in.readString();
}


 @Override
public void writeToParcel(Parcel dest, int flags) {

    dest.writeInt(this.id);
    dest.writeString(this.firstName);
    dest.writeString(this.lastName);
    dest.writeString(this.email);
    dest.writeString(this.photoPath);
    dest.writeString(this.note);
}
© www.soinside.com 2019 - 2024. All rights reserved.