2016-05-28 12 views
0

ich folgenden parcel bezweckt:Wie ein zweidimensionales parcel Array von parcelables erstellen:

public class CGameCard implements Parcelable { 
    ... 

    private int mX; 
    private int mY; 
    private String mObjectName; 
    private int mState; 

    public CGameCard(int aX, int aY, String aObjectName) { 
     mX = aX; 
     mY = aY; 
     mObjectName = aObjectName; 
     mState = CARD_STATE_NOT_MATCHED; 
    } 

    public int getX() { 
     return mX; 
    } 

    public int getY() { 
     return mY; 
    } 

    public String getObjectName(){ 
     return mObjectName; 
    } 

    public int getState() { 
     return mState; 
    } 

    ... 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(this.mX); 
     dest.writeInt(this.mY); 
     dest.writeString(this.mObjectName); 
     dest.writeInt(this.mState); 
    } 

    protected CGameCard(Parcel in) { 
     this.mX = in.readInt(); 
     this.mY = in.readInt(); 
     this.mObjectName = in.readString(); 
     this.mState = in.readInt(); 
    } 

    public static final Creator<CGameCard> CREATOR = new Creator<CGameCard>() { 
     @Override 
     public CGameCard createFromParcel(Parcel source) { 
      return new CGameCard(source); 
     } 

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

ich eine zweidimensionale parcel Anordnung dieser Objekte schaffen, um möge es in den gemeinsamen Einstellungen zu speichern für Konfigurationsänderungen. das ist, was durch das Parcel Android Studio Plugin erzeugt wird:

public class GameCardArrArr implements Parcelable { 
    private CGameCard[][] mArray; 

    public GameCardArrArr(CGameCard[][] array) { 
     mArray = array; 
    } 

    public CGameCard[][] getArray() { 
     return mArray; 
    } 

    public void setArray(CGameCard[][] mArray) { 
     this.mArray = mArray; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeParcelable(this.mArray, flags); 
    } 

    protected GameCardArrArr(Parcel in) { 
     this.mArray = in.readParcelable(CGameCard[][].class.getClassLoader()); 
    } 

    public static final Creator<GameCardArrArr> CREATOR = new Creator<GameCardArrArr>() { 
     @Override 
     public GameCardArrArr createFromParcel(Parcel source) { 
      return new GameCardArrArr(source); 
     } 

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

Was nicht da offensichtlich vom Compiler akzeptiert wird es nicht korrekt.

Die Frage: Was wäre der richtige Weg, um diese Parcelable zu erstellen?

danke im voraus.

Antwort

1

Zuerst warne ich, dass es eine sehr strenge Größenbeschränkung von 1 MB gibt, wenn Pakete übertragen werden. Wenn Sie ein Doppel-Array wie folgt machen, dann kann ich mir vorstellen, dass es sehr ist, einfach diese Grenze zu treffen und einen Absturz zu verursachen.

Wie auch immer, um die Frage zu beantworten. Sie können in ein Parcel-Objekt, das zum Erstellen des Objekts benötigt wird, absolut beliebige Objekte einfügen. In diesem Fall müssen Sie die zwei Dimensionen des Arrays kennen und dann das Array basierend auf diesen Dimensionen füllen. Alles, was Sie tun müssen, ist sicherzustellen, dass die Art, wie Sie sie schreiben, genau so ist, wie Sie sie gelesen haben (was bei allen Paketen der Fall ist).

Eine Methode wäre, zuerst zu schreiben, wie viele Arrays in Ihrem doppelten Array sind, und dann jedes Array zu schreiben.

Also in diesem Fall Ihre writeToParcel wird so etwas wie dieses:

void writeToParcel(Parcel dest, int flags) { 
    int numOfArrays = mArray.length; 
    dest.writeInt(numOfArrays); // save number of arrays 
    for (int i = 0; i < numOfArrays; i++) { 
     dest.writeParcelableArray(mArray[i], flags); 
    } 
} 

So, jetzt wissen Sie das erste int ist die Anzahl der Karten-Arrays in Ihrem Doppel Array.

GameCardArrArr(Parcel in) { 
    int numberOfArrays = in.readInt(); 
    mArray = new CGameCard[numberOfArays][]; 
    for (int i = 0; i < numberOfArrays; i++) { 
     mArray[i] = (CGameCard[]) in.readParcelabeArray(CGameCard.class.getClassLoader()); 
    } 
} 
+0

als ich versuchte, es zu implementieren, gibt es einen Kompilierungsfehler als readParcelableArray-Methode d akzeptiert nur einen Parameter. Warum gehst du auch hier an den Schöpfer? –

+0

@EmilAdz Entschuldigung. Schlechte Bearbeitung Ich habe ursprünglich 'readTypedArray' verwendet, das zwei benötigt, aber das wurde erst 23 hinzugefügt, also änderte ich es in eine universellere Version. – DeeV

+0

readTypeArray würde auch funktionieren? –

0

Dank Deev ‚s Antwort, zog ich in der richtigen Richtung. Allerdings stand ich vor einer Guss Ausnahme auf dieser Linie:

(CGameCard[]) in.readParcelabeArray(CGameCard.class.getClassLoader()); 

Um dies zu beheben, habe ich endlich writeTypedArray und createTypedArray Methoden. ist hier unter meinem Arbeits Code:

In der writeToParcel Methode der GameCardArrArr Klasse:

public void writeToParcel(Parcel dest, int flags) { 
    int numOfArrays = mArray.length; 
    dest.writeInt(numOfArrays); // save number of arrays 
    for (int i = 0; i < numOfArrays; i++) { 
     dest.writeTypedArray(mArray[i] , flags); 
    } 
} 

In in den GameCardArrArr Konstruktor mit einem Parcel als Argument:

protected GameCardArrArr(Parcel in) { 
    int numberOfArrays = in.readInt(); 
    mArray = new CGameCard[numberOfArrays][]; 
    for (int i = 0; i < numberOfArrays; i++) { 
     mArray[i] = in.createTypedArray(CGameCard.CREATOR); 
    } 
} 

Hoffen, dass es

hilft
Verwandte Themen