Parcelable 替换字段对象的值?
Parcelable replacing field object's values?
我将 ArrayList<Contact>
中的 Parcelable
对象从 Activity1 发送到 Activity2。
在我实际将对象发送到 Activity2 之前,我执行了简单的 Log.i()
函数。它打印出这个:
I/String representation from Activity1: Contact{id=1, firstName='John', lastName='Doe', email='john@gmail.com', 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='john@gmail.com', note='/storage/emulated/0/Pictures/Screenshots/Screenshot_20200502-094346__02.jpg'}
对象完全乱七八糟。 id 不可能为 6,因为我在 db 中只有一个对象。其他字段可以自己看
终于到这里了Contact
class:
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()
,都没有用。
您的 writeToParcel()
需要与您的 Contact(Parcel in)
完全匹配:如果您使用 readInt()
,则需要以完全相同的顺序使用 writeInt()
。
是的,伊恩,我确实喜欢你在评论中的建议。现在可以了。谢谢:)
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);
}
我将 ArrayList<Contact>
中的 Parcelable
对象从 Activity1 发送到 Activity2。
在我实际将对象发送到 Activity2 之前,我执行了简单的 Log.i()
函数。它打印出这个:
I/String representation from Activity1: Contact{id=1, firstName='John', lastName='Doe', email='john@gmail.com', 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='john@gmail.com', note='/storage/emulated/0/Pictures/Screenshots/Screenshot_20200502-094346__02.jpg'}
对象完全乱七八糟。 id 不可能为 6,因为我在 db 中只有一个对象。其他字段可以自己看
终于到这里了Contact
class:
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()
,都没有用。
您的 writeToParcel()
需要与您的 Contact(Parcel in)
完全匹配:如果您使用 readInt()
,则需要以完全相同的顺序使用 writeInt()
。
是的,伊恩,我确实喜欢你在评论中的建议。现在可以了。谢谢:)
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);
}