Parcelable协议要求一个Parcelable.Creator对象调用CREATOR(我有CREATOR) [英] Parcelable protocol requires a Parcelable.Creator object called CREATOR (I do have CREATOR)

查看:179
本文介绍了Parcelable协议要求一个Parcelable.Creator对象调用CREATOR(我有CREATOR)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从一个意图传递到另一个Parcelable数据,这是我得到的错误:

  08-31 14:12:22.709:E / AndroidRuntime(9931):致命异常:主要
08-31 14:12:22.709:E / AndroidRuntime(9931):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.matejsoftware.cardscoretracker / com.matejsoftware.cardscoretracker.Igra}:android.os.BadParcelableException:Parcelable协议要求称为类com.matejsoftware.cardscoretracker.Novaigra $玩家对CREATOR一个Parcelable.Creator对象
 

的事情是:我确实有Parcelable.Creator对象。我会后整个Parcelable $ C $低于C:

 公共类播放器实现Parcelable {
    字符串名称;
    INT得分;
    @覆盖
    公众诠释describeContents(){
        // TODO自动生成方法存根
        返回0;
    }
    @覆盖
    公共无效writeToParcel(包裹DEST,INT标志){
        dest.writeString(名称);
        dest.writeInt(分);
    }

    公开播放器(宗源){
        得分= source.readInt();
        NAME = source.readString();
    }

    公开播放器(INT得分,字符串名称){
        this.score =得分;
        this.name =名称;
    }
}

公共类MyCreator实现Parcelable.Creator<播放器> {

    @覆盖
    公共球员createFromParcel(宗源){
        返回新的播放器(源);
    }

    @覆盖
    公开播放器[] newArray(INT尺寸){
        返回新玩家【尺寸】;
    }

}
 

时有事端错的造物主吗?这个应用程序,一旦崩溃,我按一下按钮,开始下一个活动。

这是我如何检索中的第二个活动Parcelable数据:

  //全局变量
ArrayList的<播放器> playersParceledData;

//这是在的onCreate
playersData = getIntent();
playersParceledData = playersData.getParcelableArrayListExtra(parceledData);
 

此外,这是我怎么把类对象ParcelableArrayListExtra:

 玩家newPlayer =新播放器(0,文本);
playersParceledData.add(newPlayer);
zacniIgro.putParcelableArrayListExtra(parceledData,playersParceledData);
 

解决方案

我亲爱的朋友 你是不是维护包裹序列

在方法 writeToParcel 你首先把字符串,但在构造你把第一个整数它不是在Android的有效,我已经给你code,这使得正确的顺序将数据放入到包裹

访问此链接

所以正确的code是

刚刚替换

 公共类FriendDetail实现Parcelable {

私人字符串FULL_NAME;
私人诠释隐私;

公共HeatFriendDetail(包裹中){
    this.full_name = in.readString();
    this.privacy = in.readInt();
}

公共HeatFriendDetail(){

}

@覆盖
公共无效writeToParcel(包裹DEST,INT标志){

    dest.writeString(this.full_name);
    dest.writeInt(this.privacy);
}

公共静态最终Parcelable.Creator CREATOR =新Parcelable.Creator(){
    公共HeatFriendDetail createFromParcel(包裹中){
        返回新HeatFriendDetail(中);
    }

    公共HeatFriendDetail [] newArray(INT尺寸){
        返回新HeatFriendDetail【尺寸】;
    }
};

//吸气剂SETTER //

}
 

I am trying to pass Parcelable data from one intent to another and this is the error I am getting:

08-31 14:12:22.709: E/AndroidRuntime(9931): FATAL EXCEPTION: main
08-31 14:12:22.709: E/AndroidRuntime(9931): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matejsoftware.cardscoretracker/com.matejsoftware.cardscoretracker.Igra}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.matejsoftware.cardscoretracker.Novaigra$Player

The thing is: I do have Parcelable.Creator object. I'll post the whole Parcelable code below:

public class Player implements Parcelable{
    String name;
    int score;
    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(score);
    }

    public Player(Parcel source){
        score = source.readInt();
        name = source.readString();
    }

    public Player(int score, String name){
        this.score = score;
        this.name = name;
    }
}

public class MyCreator implements Parcelable.Creator<Player> {

    @Override
    public Player createFromParcel(Parcel source) {
        return new Player(source);
    }

    @Override
    public Player[] newArray(int size) {
        return new Player[size];
    }

}

Is there somethin wrong with the CREATOR? The app crashes as soon as I click the button to start the next activity.

This is how I "retrieve" Parcelable data in the second activity:

//global variable
ArrayList<Player> playersParceledData;

//This is in onCreate
playersData = getIntent();
playersParceledData = playersData.getParcelableArrayListExtra("parceledData");

Also, this is how I put class objects to ParcelableArrayListExtra:

Player newPlayer = new Player(0, text);
playersParceledData.add(newPlayer);
zacniIgro.putParcelableArrayListExtra("parceledData", playersParceledData);

解决方案

my dear friends you are not maintain the sequence in parcel

in method writeToParcel you first put String but in Constructor you take first integer it is not valid in android, I have give you code which makes correct order to putting data in to Parcel

visit this link

so correct code is

just Replace with

public class FriendDetail implements Parcelable {

private String full_name;
private int privacy;

public HeatFriendDetail(Parcel in) {
    this.full_name = in.readString();
    this.privacy = in.readInt();
}

public HeatFriendDetail() {

}

@Override
public void writeToParcel(Parcel dest, int flags) {

    dest.writeString(this.full_name);
    dest.writeInt(this.privacy);
}

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

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

// GETTER SETTER//

}

这篇关于Parcelable协议要求一个Parcelable.Creator对象调用CREATOR(我有CREATOR)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆