Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.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
Android 安卓:让一个类可以打包_Android - Fatal编程技术网

Android 安卓:让一个类可以打包

Android 安卓:让一个类可以打包,android,Android,我想在Android中的两个活动之间传递对象,这将我引向parcelable类。我没有试图转换我当前的类,但不理解Parcelable.Creator方法 这就是我目前所拥有的 public class Account implements Parcelable{ /** * Declare private variables */ private String fName; private String lName; private String screenName; private

我想在Android中的两个活动之间传递对象,这将我引向parcelable类。我没有试图转换我当前的类,但不理解Parcelable.Creator方法

这就是我目前所拥有的

public class Account implements Parcelable{

/**
 * Declare private variables
 */

private String fName;
private String lName;
private String screenName;
private String email;
private String level;
private int userId;
//private Context myContext;

/**
 * Account constructor
 */

public Account(String fName, String lName, String sName, String email, String level, String x) throws Exception{    


    /**Parse userId into int */
    this.userId = Integer.parseInt(x);

    /**Select from DB user details */


    /**Initialize variables with results */
    this.setfName(fName);
    this.setlName(lName);
    this.setScreenName(sName);
    this.setEmail(email);
    this.setLevel(level);



}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel out, int flags) {
    // TODO Auto-generated method stub
    out.writeString(fName);
    out.writeString(lName);
    out.writeString(screenName);
    out.writeString(email);
    out.writeString(level);
    out.writeInt(userId);

}

// this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
public static final Parcelable.Creator<Account> CREATOR = new Parcelable.Creator<Account>() {
    public Account createFromParcel(Parcel in) {
        return new Account(in);
    }

    public Account[] newArray(int size) {
        return new Account[size];
    }
};



/**
 * Getters and setters for all variables from Account class
 */

public int getUserId(){
    return userId;
}

public String getScreenName() {
    return screenName;
}

public void setScreenName(String screenName) {
    this.screenName = screenName;
}

public String getfName() {
    return fName;
}

public void setfName(String fName) {
    this.fName = fName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getLevel() {
    return level;
}

public void setLevel(String level) {
    this.level = level;
}

public String getlName() {
    return lName;
}

public void setlName(String lName) {
    this.lName = lName;
}



}
public类帐户实现可包裹{
/**
*声明私有变量
*/
私有字符串fName;
私有字符串名称;
私有字符串屏幕名;
私人字符串电子邮件;
私有字符串级别;
私有int用户id;
//私人语境;
/**
*帐户构造函数
*/
公共帐户(字符串fName、字符串lName、字符串sName、字符串电子邮件、字符串级别、字符串x)引发异常{
/**将userId解析为int*/
this.userId=Integer.parseInt(x);
/**从数据库用户详细信息中选择*/
/**使用结果初始化变量*/
this.setfName(fName);
this.setlName(lName);
这个。设置屏幕名称(sName);
这个.setEmail(email);
这个.setLevel(level);
}
@凌驾
公共int描述内容(){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共无效写入包(包出,内部标志){
//TODO自动生成的方法存根
out.writeString(fName);
out.writeString(lName);
out.writeString(屏幕名称);
外写(电子邮件);
out.writeString(级别);
out.writeInt(userId);
}
//这用于重新生成对象。所有地块都必须有一个实现这两种方法的创建者
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共帐户createFromParcel(地块中){
返回新帐户(在中);
}
公共帐户[]新数组(整数大小){
返回新帐户[大小];
}
};
/**
*Account类中所有变量的getter和setter
*/
public int getUserId(){
返回用户标识;
}
公共字符串getScreenName(){
返回屏幕名称;
}
公共无效设置屏幕名称(字符串屏幕名称){
this.screenName=屏幕名称;
}
公共字符串getfName(){
返回fName;
}
公共void setfName(字符串fName){
this.fName=fName;
}
公共字符串getEmail(){
回复邮件;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
公共字符串getLevel(){
回报水平;
}
公共void setLevel(字符串级别){
这个水平=水平;
}
公共字符串getlName(){
返回lName;
}
公共void setlName(字符串lName){
this.lName=lName;
}
}
提前谢谢

public static final Parcelable.Creator CREATOR =
    new Parcelable.Creator() {
        public ObjectB createFromParcel(Parcel in) {
            return new ObjectB(in);
        }

        public ObjectB[] newArray(int size) {
            return new ObjectB[size];
        }
    };

Android需要此字段才能单独或以数组的形式创建新对象。这也意味着您可以使用默认构造函数来创建对象,并根据需要使用另一个方法来混合它

看看这个


这是一个很好的Android parcelable实现工具


这里是另一个使用简单注释创建可包裹对象的工具

您可以找到我不久前编写的一些代码,用于简化包裹处理(例如,对包裹进行写入和读取,简化创建者的初始值设定代码)

给包裹写信:

parcelValues(dest, name, maxSpeed, weight, wheels, color, isDriving);
// [...]
color = (CarColor)unparcelValue(CarColor.class.getClassLoader());
isDriving = (Boolean)unparcelValue();
例如,其中color是枚举,isDriving是布尔值

从包裹上阅读:

parcelValues(dest, name, maxSpeed, weight, wheels, color, isDriving);
// [...]
color = (CarColor)unparcelValue(CarColor.class.getClassLoader());
isDriving = (Boolean)unparcelValue();
创建类的创建者:

public static final Parcelable.Creator<Car> CREATOR = 
    Parceldroid.getCreatorForClass(Car.class);
公共静态最终包裹。创建者=
Parceldroid.getCreatorForClass(Car.class);
…或对于枚举:

public static final Parcelable.Creator<CarColor> CREATOR = 
    Parceldroid.getCreatorForEnum(CarColor.class);
公共静态最终包裹。创建者=
graceldroid.getCreatorForEnum(CarColor.class);

请看一下我添加到项目中的“ParceldroidExample”。

可以使用serializable和Parcelable在活动之间传输数据。但是包裹被认为是最好的

android中有一个插件,可以为类中的字段插入可打包的代码。您可以从菜单文件>设置>插件>安卓包裹代码生成器中找到它


并使用快捷方式alt+insert,就像使用getter和setter一样使用插件。

您可以使用无需硬编码的方法轻松创建一个parcelable类,Android studio 4.1.2只需几秒钟即可为您完成

创建新的包裹类别:

步骤1:通过按windows的
Alt+Enter
和mac的
Option+Enter
实现包裹方法,但您会发现
writeToParcel
第一次是空的-

第2步:然后你会发现你的类名现在是红色的。因此,您需要添加
CREATOR
类,并通过按windows的
Alt+Enter
和mac的
Option+Enter
来填充空的
writeToParcel
-

最后,你会看到你的班级现在将是一个完全可包裹的班级

更新现有的包裹类别:


步骤1:如果需要在现有类中添加一些新字段,则需要删除以前的
writeToParcel
DescripteBontents
方法和
CREATOR
类,并执行与第一节“创建新的parcelable类”中描述的相同步骤。此工具非常有用。我正在寻找这种工具。感谢您与我们共享该页面。@Andreyperov它现在是。该页面无效again@VaibhavGupta现在请检查它是否工作正常(您可以排除某些字段,但它仍会生成包含所有字段的代码)“Android需要此字段才能创建新对象”——但什么时候?