如何将Parcelable用于具有多个构造函数的类?

时间:2014-06-02 16:04:15

标签: java android parcelable

好吧,我试图将对象的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?

3 个答案:

答案 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 中存在多个构造函数时不需要特别注意。