Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为具有多个构造函数的类使用Parcelable?_Java_Android_Parcelable - Fatal编程技术网

Java 如何为具有多个构造函数的类使用Parcelable?

Java 如何为具有多个构造函数的类使用Parcelable?,java,android,parcelable,Java,Android,Parcelable,嗯,我试图将对象的arraylist从一个活动传递到另一个活动。我班上有两名建设者。 如果(我使用)可序列化,则代码如下所示: @SuppressWarnings("serial") public class Student implements Serializable { private int studentdID; private String studentName; private String studentDept; public Student(){} public

嗯,我试图将对象的arraylist从一个活动传递到另一个活动。我班上有两名建设者。 如果(我使用)可序列化,则代码如下所示:

@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那样设置类中变量的值?我的意思是分别使用两个构造函数,一个没有ID,另一个没有ID?

你读过Parcelable是如何工作的吗

您只需要一个Constructor for parcelable来读取您传递给它的内容,
parcelable
界面将添加一个方法
writeToParcel
,其中您将保存数据

这不是像可序列化的
那样的自动过程,一切都取决于您

Parcelable
将使用的构造函数将只接受一个参数
Parcel
,其中您将找到一些方法,如
read*(KEY)
来读回值

writeToParcel
中,您将在
Parcel
(该方法的参数)中写入希望通过
write*(键,值)
传递的值

Parcelable
不关心构造函数或字段


另外,你还需要一个
创建者。如果需要,可以在线阅读一些教程以了解更多信息。

您是否阅读了Parcelable的工作原理

您只需要一个Constructor for parcelable来读取您传递给它的内容,
parcelable
界面将添加一个方法
writeToParcel
,其中您将保存数据

这不是像可序列化的
那样的自动过程,一切都取决于您

Parcelable
将使用的构造函数将只接受一个参数
Parcel
,其中您将找到一些方法,如
read*(KEY)
来读回值

writeToParcel
中,您将在
Parcel
(该方法的参数)中写入希望通过
write*(键,值)
传递的值

Parcelable
不关心构造函数或字段


另外,你还需要一个
创建者。如果需要,可以在线阅读一些教程来了解更多信息。

马可的回答解释了为什么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();
  }
^上述构造函数将允许正确实例化必要的变量。此外,您还可以定义如下内容:

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);
}
当然,您需要像这样定义
创建者

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];
   }
public static final Parcelable.Creator=新的Parcelable.Creator(){
公立学生createFromParcel(包裹中){
返回新学生(在);
}
公立学生[]新数组(整数大小){
返回新学生[大小];
}

})

马可的回答解释了为什么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();
  }
^上述构造函数将允许正确实例化必要的变量。此外,您还可以定义如下内容:

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);
}
当然,您需要像这样定义
创建者

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];
   }
public static final Parcelable.Creator=新的Parcelable.Creator(){
公立学生createFromParcel(包裹中){
返回新学生(在);
}
公立学生[]新数组(整数大小){
返回新学生[大小];
}

})

@u3l解决方案不是必需的。有多少构造函数并不重要。 它的工作原理很简单,可以正常实现。
我的意思是,当多个构造器出现在parcelable中时,不需要特别注意。

@u3l解决方案是不需要的。有多少构造器并不重要。 它的工作原理很简单,可以正常实现。
我的意思是,当多个构造器出现在parcelable中时,不需要特别注意。

下划线的攻击。你到底为什么要用这么多?方法名可以是camelCase,我认为这会提高可读性…编辑:-),但如何解决这个问题呢?下划线攻击。你到底为什么要用这么多?方法名称可以是camelCase,我认为这会提高可读性…编辑:-)但如何解决这个问题?这是对@u3l添加的答案的注释这是对@u3l添加的答案的注释