Ich versuche, ArrayList
Parcelable
eine Liste benutzerdefinierter Objekte zu erstellen, um sie an eine Aktivität zu übergeben. Ich beginne eine myObjectList
Klasse zu schreiben , die erweitert ArrayList<myObject>
und implementiert Parcelable
.
Einige Attribute von MyObject
sind boolean
, Parcel
haben aber keine Methode read/writeBoolean
.
Was ist der beste Weg, um damit umzugehen?
android
parcelable
grunk
quelle
quelle
Serializable
Schnittstelle nicht für die Kommunikation zwischen Aktivitäten verwenden. Es ist langsam.Antworten:
So würde ich es machen ...
writeToParcel:
readFromParcel:
quelle
/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }
writeByte
, aber tatsächlich ein int schreibt.Sie können auch die writeValue- Methode verwenden. Meiner Meinung nach ist das die einfachste Lösung.
Danach können Sie es einfach mit einer einfachen Besetzung abrufen, um
Boolean
:Unter der Haube wird das Android Framework es als Ganzzahl behandeln:
quelle
Sie erklären so
schreiben
lesen
Der boolesche Typ muss in etwas konvertiert werden, das Parcel unterstützt, damit wir ihn in int konvertieren können.
quelle
In AndroidStudio (mit 2,3 atm) können Sie nach der Implementierung von Parcelable in Ihrer Klasse einfach den Mauszeiger über den Klassennamen halten und werden aufgefordert, die Parcelable-Implementierung hinzuzufügen:
Aus den vier Feldern wird Folgendes generiert:
quelle
Ich habe sie normalerweise in einem Array und rufe
writeBooleanArray
und anreadBooleanArray
Wenn es sich um einen einzelnen Booleschen Wert handelt, den Sie packen müssen, können Sie Folgendes tun:
quelle
quelle
Gehen Sie einfach zu Datei-> Einstellungen-> Plugins-> Repository durchsuchen und suchen Sie nach einem Paket. Siehe Bild
Es wird automatisch Parcelable erstellt.
Und dafür gibt es auch eine Website. http://www.parcelabler.com/
quelle
Kurze und einfache Implementierung in Kotlin mit nullbarer Unterstützung:
Fügen Sie dem Paket Methoden hinzu
Und benutze es:
quelle
Sie können Ihre booleschen Werte durch Maskieren und Verschieben in ein Byte packen. Das wäre der effizienteste Weg, und wahrscheinlich ist es das, was sie von Ihnen erwarten würden.
quelle
writeByte()
Methode deswriteInt()
Es ist schwer, die eigentliche Frage hier zu identifizieren. Ich denke, es ist, wie man mit Booleschen Werten umgeht, wenn man die
Parcelable
Schnittstelle implementiert .Sie müssen den Wert entweder als Zeichenfolge oder als Byte speichern. Wenn Sie sich für eine Zeichenfolge entscheiden, müssen Sie die statische Methode der
String
aufgerufenen Klasse verwendenvalueOf()
, um den booleschen Wert zu analysieren. Es ist nicht so effektiv wie das Speichern in einem harten Byte.Wenn Sie sich für ein Byte entscheiden, müssen Sie selbst eine Konvertierungslogik implementieren.
Wenn Sie das
Parcel
Objekt entfernen , müssen Sie sich um die Konvertierung in den ursprünglichen Typ kümmern.quelle
writeByte()
direkt aufruftwriteInt()
. Die Konvertierungslogik ist zu ausführlich. Tun Sie es einfachwriteInt(boolean ? 1 : 0)
undboolean = readInt() != 0
Diese Frage wurde bereits von anderen perfekt beantwortet, wenn Sie es selbst tun möchten.
Wenn Sie es vorziehen, den größten Teil des Paketcodes auf niedriger Ebene zu kapseln oder zu verbergen, können Sie einen Teil des Codes verwenden, den ich vor einiger Zeit geschrieben habe, um die Handhabung von Paketen zu vereinfachen.
Das Schreiben auf ein Paket ist so einfach wie:
Dabei ist Farbe beispielsweise eine Aufzählung und isDriving ein Boolescher Wert.
Das Lesen von einem Paket ist auch nicht viel schwieriger:
Schauen Sie sich einfach das "ParceldroidExample" an, das ich dem Projekt hinzugefügt habe.
Schließlich hält es auch den CREATOR-Initialisierer kurz:
quelle
.class.getClassLoader()
.Es gibt viele Beispiele in den Android (AOSP) -Quellen. Die
PackageInfo
Klasse hat beispielsweise ein boolesches ElementrequiredForAllUsers
und wird wie folgt serialisiert:quelle