好吧,我试图将对象的arraylist从一个活动传递到另一个活动。我在班级学生中有2个构造函数。 如果,我使用Serializable而不是代码如下:
@SuppressWarnings("serial")
public class Student implements Serializable
{
private int studentdID;
private String studentName;
private String studentDept;
public Student(){}
public Student(String name, String dpt)
{ this.studentName = name;
this.studentDept = dpt;}
public Student(int id, String name, String dpt)
{ this.studentdID = id;
this.studentName = name;
this.studentDept = dpt; }
public int getstudentdID() { return studentdID; }
public void setstudentdID(int studentdID) {this.studentdID = studentdID;}
public String getstudentName() { return studentName;}
public void setstudentName(String studentName) {this.studentName = studentName;}
public String getstudentDept() { return studentDept; }
public void setstudentDept(String studentDept) { this.studentDept = studentDept;}
}
但我面临的问题是我怎么用parcelable做这件事?我如何在类中设置变量的值,就像我使用Serializable一样?我的意思是分别使用2个构造函数 - 一个没有ID,另一个没有ID?
答案 0 :(得分:5)
您是否了解过Parcelable的工作原理?
您只需要一个conscecutor for parcelable来阅读您传递给它的内容,Parcelable
界面将添加一个方法writeToParcel
,其中您将数据保存。
这不是像Serializable
那样的自动过程,一切都取决于你。
Parcelable
将使用的构造函数只接受一个参数Parcel
,您可以在其中找到一些方法,例如read*(KEY)
来回读值。
在writeToParcel
中,您将在Parcel
(方法的参数)中写下您希望传递给write*(KEY, VALUE)
的值。
Parcelable
不关心你的构造函数或字段。
P.S你也需要一个CREATOR
。如果需要,请在线阅读一些教程以了解更多信息。
答案 1 :(得分:3)
Marco的回答解释了为什么Parcelable不会自动决定使用什么构造函数 - 它不能。
然而,有一种解决方法。使用Parcel.dataAvail()
,
返回要从宗地中读取的剩余数据量。那 是,dataSize() - dataPosition()。
例如,
public Student(){}
public Student(String name, String dpt)
{
this.studentName = name;
this.studentDept = dpt;}
public Student(int id, String name, String dpt)
{ this.studentdID = id;
this.studentName = name;
this.studentDept = dpt;
}
public Student(Parcel in) {
name = in.readString();
dpt = in.readString();
if(in.dataAvail() > 0) // is there data left to read?
id = in.readInt();
}
^上述构造函数将允许正确实例化必要的变量。另外,您可以定义writeToParcel()
之类的内容:
public void writeToParcel(Parcel out) {
out.writeString(name);
out.writeString(dpt);
//0 is the default value of id if you didn't initialize it like
// in the first constructor. If it isn't 0, that means it was initialized.
if(id != 0)
out.writeInt(id);
}
当然,您需要像这样定义CREATOR
:
public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() {
public Student createFromParcel(Parcel in) {
return new Student(in);
}
public Student[] newArray(int size) {
return new Student[size];
}
};
答案 2 :(得分:0)
@u3l 解决方案不是必需的..有多少构造函数并不重要。 很简单,它可以正常实现。 我的意思是当 Parcelable 中存在多个构造函数时不需要特别注意。