Java 如何为具有多个构造函数的类使用Parcelable?
嗯,我试图将对象的arraylist从一个活动传递到另一个活动。我班上有两名建设者。 如果(我使用)可序列化,则代码如下所示: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
@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添加的答案的注释