2016-06-20 14 views
0

Parcel

Ich habe diese Player Klasse lesen:Wie die Schreib implementieren und in Parcel Klasse

public class Player implements Parcelable { 
private String mName; // Player's name 
private Card mCard; // Player's current card 
private boolean mLifeStatus = true; // Player's life status 
private boolean mProtected = false; // If the Player's been protected by the guard or not 
private int mId; // ID of the Player 
private int mCount; 

/* everything below here is for implementing Parcelable */ 

// 99.9% of the time you can just ignore this 
@Override 
public int describeContents() { 
    return 0; 
} 

// write your object's data to the passed-in Parcel 
@Override 
public void writeToParcel(Parcel out, int flags) { 
    out.writeString(mName); 
    out.writeValue(mCard); 
    out.writeValue(mLifeStatus); 
    out.writeValue(mProtected); 
    out.writeInt(mId); 
    out.writeInt(mCount); 
} 

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

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

// example constructor that takes a Parcel and gives you an object populated with it's values 
private Player(Parcel in) { 
    mName = in.readString(); 
    mCard = in.readValue(); 
    mLifeStatus = in.readValue(mLifeStatus); 
    mProtected = in.readValue(mProtected); 
    mId = in.readInt(); 
    mCount = in.readInt(); 
} 
} 

Ich habe versucht zu füllen den letzten Konstruktor von mir, aber ich weiß nicht, wie um den Wert von booleans und von benutzerdefinierten Klassen zu lesen, genau wie meine Klasse Card, die die Klasse für den mValue mCard ist.

Ich habe versucht, diese zu verwenden, aber die Arbeit immer noch nicht: mCard = in.readValue(Card.class.getClassLoader);

Wie soll ich diese beiden Methoden schreiben, um die Klasse implementieren Parcelable zu machen, wie es sein soll ist?

+1

Hat '' Card' Parcelable' implementieren? Wenn nicht, muss es –

Antwort

1

Um die Karte zu

out.writeParcelable(mCard, flags); 

Zum Lesen der Karte

mCard = (Card) in.readParcelable(Card.class.getClassLoader()); 

Um die Boolesche

out.writeInt(mLifeStatus ? 1 : 0); 
out.writeInt(mProtected ? 1 : 0); 

die Boolesche schreiben zu schreiben

01 lesen
mLifeStatus = in.readInt() == 1; 
mProtected = in.readInt() == 1; 

(Dies ist, wie writeValue und readValue Arbeit intern für Boolean Typen)

+0

Prost wie immer Mann :) – FET

-1

writeToParcel:

dest.writeByte((byte) (myBoolean ? 1 : 0)); 

readFromParcel:

myBoolean = in.readByte() != 0; 

ref: https://stackoverflow.com/a/7089687/4577267

+0

Bitte nicht offensichtlich Copy-Paste-Antworten. Außerdem hast du die Frage nicht vollständig beantwortet. –

1

A Parcel primitive Typen und Parcel Objekte speichern können. Das bedeutet, dass alles, was im Paket gespeichert wird, entweder ein primitiver Typ oder ein parzellierbares Objekt sein muss.

Betrachtet man die Mitgliedsdaten von Player, sehe ich eine Reihe primitiver Typen und einen komplexeren Typ: Karte.

Um eine Karte in Ihrem Paket zu speichern, müssen Sie die Kartenklasse Parcelable erstellen.

Alternativ können Sie, wenn die Player-Klasse Zugriff auf die internen Details der Karte hat, Code schreiben, um die primitiven Typen aus der Karte zu ziehen und sie zu speichern, dann auf der Leseseite die primitiven Typen aus dem Paket ziehen und verwenden um eine Karte zu bauen. Diese Technik funktioniert nur, wenn Card so einfach ist, dass Sie sich nicht um die Kapselung kümmern müssen.