Parcelable协议需要一个名为CREATOR的Parcelable.Creator对象(我有CREATOR)

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

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 

事情是:我有Parcelable.Creator对象。 我将发布下面的整个Parcelable代码:

 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]; } } 

CREATOR有什么问题吗? 我点击button开始下一个活动,应用程序崩溃。

这就是我在第二个活动中“检索”Parcelable数据的方法:

 //global variable ArrayList<Player> playersParceledData; //This is in onCreate playersData = getIntent(); playersParceledData = playersData.getParcelableArrayListExtra("parceledData"); 

另外,这是我如何把类对象ParcelableArrayListExtra:

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

Solutions Collecting From Web of "Parcelable协议需要一个名为CREATOR的Parcelable.Creator对象(我有CREATOR)"

从包裹中读取的顺序与您写入的顺序不同。

writeToParcel()您首先将string放入HeatFriendDetail(Parcel in) ,然后您首先读取整数。 这是不正确的方式,因为命令或读/写很重要。

以下是从/向Parcel写入/读取数据时的正确顺序的代码(另请参阅此链接 ):

 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// } 

我只收到发布apk的错误,因为CREATOR不公开。

我改变了这个:

 static final Parcelable.Creator<Station> CREATOR = new Parcelable.Creator<Station>() { 

对此:

 public static final Parcelable.Creator<Station> CREATOR = new Parcelable.Creator<Station>() { 

刚刚碰到这个。

我有一个预感,我看着我的ProGuard映射文件。

通常我这样声明CREATOR:

  public static final Parcelable.Creator<ClassA> CREATOR = new Parcelable.Creator<ClassA>() { 

这在映射文件中显示如下:

  android.os.Parcelable$Creator CREATOR -> CREATOR 

除一个类外,报告错误的类。 我这样宣布:

  public static Creator<ClassB> CREATOR = new Creator<ClassB>() { 

你瞧,

  android.os.Parcelable$Creator CREATOR -> a 

因此,如果您在生产版本中收到此exception,请检查映射文件。 我认为ProGuard在决定不混淆CREATOR的时候非常敏感。

当CREATOR类不是静态的时候,我有这个错误消息

试试这个方法

 // create List of player ArrayList<HashMap<String, String>> players = new ArrayList<HashMap<String, String>>(); //create Player HashMap<String, String> player = new HashMap<String, String>(); player.put("score", "20");//replace 20 with your score variable player.put("name", "Biraj");//replace Biraj with your name variable // Add to arraylist players.add(player); // pass to intent Intent i; i.putExtra("PLAYERS", players); // read From intent ArrayList<HashMap<String, String>> playerFromintent = (ArrayList<HashMap<String, String>>) getIntent().getSerializableExtra("PLAYERS"); // read from ArrayList for (HashMap<String, String> hashMap : playerFromintent) { System.out.println("Name : " + hashMap.get("name")); System.out.println("Score : " + hashMap.get("score")); }