2013-08-31 10 views
18

Próbuję przekazać dane Parcelable z jednego do drugiego i zamiarem jest to błąd otrzymuję:Parcelable protokół wymaga obiektu Parcelable.Creator nazwie CREATOR (muszę CREATOR)

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 

Rzecz : Mam obiekt Parcelable.Creator. Opublikuję cały kod Działka poniżej:

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

} 

Czy jest coś nie tak z Kreatorem? Aplikacja ulega awarii, gdy tylko kliknę przycisk, aby rozpocząć następną czynność.

To jak ja „odzyskać” dane Parcelable w drugiej działalności:

//global variable 
ArrayList<Player> playersParceledData; 

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

Ponadto, jest to w jaki sposób mogę umieścić obiekty klasy do ParcelableArrayListExtra:

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

I zaleca się stosowanie ArrayList > ponieważ nie wymaga konwersji można łatwo przenosić między działaniami z użyciem getSeriasableExtra(). Ponieważ widzę twój kod, nie masz żadnych złożonych danych do zapisania, więc nie ma sensu zakładać specjalnego POJO do przechowywania. –

+0

@BirajZalavadia, czy możesz podać mi krótki przykład na to, jak mój kod będzie wyglądał w HashMap? Nigdy wcześniej tego nie używałem i nie mogę naprawdę zobaczyć, jak używać tego z oficjalnych dokumentów. – Guy

+0

Twoja klasa "player" nie deklaruje statycznego członu "CREATOR". Deklaruje jedynie implementację klasy Creator ('MyCreator'). Oprócz poprawienia sekwencji, musisz dodać człon "CREATOR" do "gracza". – Les

Odpowiedz

27

Ty masz inny Sekwencja odczyt z Parcel niż ten, w którym piszesz.

W writeToParcel() najpierw dodajesz String, ale w HeatFriendDetail(Parcel in), fi Najpierw przeczytaj liczbę całkowitą. Nie jest to poprawna metoda, ponieważ ważna jest kolejność lub odczyt/zapis.

Poniżej znajduje się kod, który umożliwia prawidłową kolejność podczas zapisu/odczytu danych do/z działki (patrz również this link):

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

Zrobiłem to, ale nadal dostaję ten sam błąd – Guy

+0

który błąd ...? –

+0

Wyjątek java.lang.RuntimeException: Nie można rozpocząć działania ComponentInfo {com.matejsoftware.cardscoretracker/com.matejsoftware.cardscoretracker.Igra}: android.os.BadParcelableException: Protokół Parcelable wymaga obiektu Parcelable.Creator o nazwie CREATOR w klasie com.matejsoftware. cardscoretracker.Novaigra $ Player – Guy

-1

Spróbuj w ten sposób

// 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")); 
     } 
1

miałem ten komunikat o błędzie, gdy klasa CREATOR nie była statyczna

2

Wpadłem na to.

Miałem przeczucie i zajrzałem do pliku mapowania ProGuard.

Normalnie Oświadczam CREATOR tak:

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

który pojawia się w pliku mapowania jak poniżej:

android.os.Parcelable$Creator CREATOR -> CREATOR 

..except dla jednej klasy, klasy, który został zgłoszony z błędem . Oświadczyłem to tak:

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

I oto:

android.os.Parcelable$Creator CREATOR -> a 

Więc jeśli otrzymujesz ten wyjątek w swoim wydaniu produkcyjnej sprawdzić plik mapowania. Sądzę, że ProGuard jest bardzo wrażliwy na to, jak deklaruje się TWÓRCA, decydując się go nie zaciemniać.

4

Otrzymałem ten błąd tylko w wersji Release APK, ponieważ TWÓRCA nie był publiczny.

zmieniłem to:

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

do tego:

public static final Parcelable.Creator<Station> CREATOR = new Parcelable.Creator<Station>() { 
Powiązane problemy