Ich habe Probleme, meine Klasse zu machen Parcelable
. Das Problem ist, ich versuche, ein Mitglied in der Klasse, das ein ArrayList<Parcelable>
Objekt ist, auf das Paket zu schreiben . Das ArrayList
ist Serializable
und die Objekte ( ZigBeeDev
) in der Liste sind Parcelable
.
Hier ist der relevante Code:
package com.gnychis.coexisyst;
import java.util.ArrayList;
import java.util.Iterator;
import android.os.Parcel;
import android.os.Parcelable;
public class ZigBeeNetwork implements Parcelable {
public String _mac; // the source address (of the coordinator?)
public String _pan; // the network address
public int _band; // the channel
ArrayList<Integer> _lqis; // link quality indicators (to all devices?)
ArrayList<ZigBeeDev> _devices; // the devices in the network
public void writeToParcel(Parcel out, int flags) {
out.writeString(_mac);
out.writeString(_pan);
out.writeInt(_band);
out.writeSerializable(_lqis);
out.writeParcelable(_devices, 0); // help here
}
private ZigBeeNetwork(Parcel in) {
_mac = in.readString();
_pan = in.readString();
_band = in.readInt();
_lqis = (ArrayList<Integer>) in.readSerializable();
_devices = in.readParcelable(ZigBeeDev.class.getClassLoader()); // help here
}
public int describeContents() {
return this.hashCode();
}
public static final Parcelable.Creator<ZigBeeNetwork> CREATOR =
new Parcelable.Creator<ZigBeeNetwork>() {
public ZigBeeNetwork createFromParcel(Parcel in) {
return new ZigBeeNetwork(in);
}
public ZigBeeNetwork[] newArray(int size) {
return new ZigBeeNetwork[size];
}
};
//...
}
Ich habe zwei Stellen mit "// help here" markiert, um zu verstehen, wie man richtig auf das Paket schreibt und es rekonstruiert. Wenn ZigBeeDev
heißt Parcelable
(richtig getestet), wie mache ich das richtig?
java
android
serialization
parcelable
gnychis
quelle
quelle
ZigBeeDev.Creator
sein sollteZigBeeDev.CREATOR
. Ich habe jedes Mal einen Fehler erhalten, bis mir klar wurde, dass es zwei verschiedene Schöpfer gibt, die ich in meinem eigenen Projekt verwenden kann.cannot convert from void to ArrayList<Integer>
Hashtable
, die Primitivtypen (einschließlichString
) für einen seiner Schlüssel oder Werte verwenden.In meinem Fall
in.readTypedList(_devices, ZigBeeDev.CREATOR);
gab mir einNullPointerException
auf_devices
. Also habe ich folgendes benutzt:quelle
in.readTypedList()
eine neue ArrayList () erstellen und diese dann an die übergeben müssen.in.readTypedList(yourNewArrayList, YourObj.CREATOR)
Andernfalls wird nur versucht, die Daten in eine Nullliste aufzunehmen.Sie sollten writeList (Liste l) für Ihre Liste von Ganzzahlen und writeTypedList (Listenwert) für die Liste von ZigBeeDevices verwenden
quelle
Im Konstruktor sollten Sie verwenden
Und in "writeToParcel" verwenden
quelle
Ein bisschen spät, aber ich hatte auch dieses Problem. Nach langer Zeitverschwendung bin ich auf die Website parcelabler.com gestoßen, die automatisch Pakete für Sie erstellt.
Dadurch konnte ich sehr einfach ein verschachteltes Paket mit einer darin enthaltenen Array-Liste erstellen und viel Zeit sparen.
Grundsätzlich funktioniert die Website so, dass Sie Ihr Objekt mit der darin enthaltenen ArrayList eingeben und automatisch die erforderlichen Methoden hinzufügen, um es paketfähig zu machen (Lesen aus Paket, Schreiben in Paket, Beschreiben von Inhalten und Paketersteller werden automatisch generiert). Dies ist besonders nützlich, wenn Sie komplexe Pakete erstellen, wie in der hier gestellten Frage, die verschachtelte Pakete, Arrays und Listen enthalten.
BEARBEITEN: Auch IntelliJ IDEA und Android Studio haben Plugins dafür, die etwas Ähnliches wie die aufgelistete Website tun:
Diese Plugins generieren den Code für Android Parcelable- Boilerplates basierend auf Feldern in der Klasse.
quelle