Próbuję utworzyć ArrayList
Parcelable
w celu przekazania do działania listy niestandardowego obiektu. Zaczynam pisaćmyObjectList
zajęcia, które rozszerzają ArrayList<myObject>
i wdrażają Parcelable
.
Niektóre atrybuty MyObject
są boolean
aleParcel
nie mają żadnej metody read/writeBoolean
.
Jaki jest najlepszy sposób, aby sobie z tym poradzić?
android
parcelable
grunk
źródło
źródło
Serializable
interfejsu do komunikacji między działaniami. To jest wolne.Odpowiedzi:
Oto jak bym to zrobił ...
writeToParcel:
readFromParcel:
źródło
/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }
writeByte
, ale w rzeczywistości zapisuje int.Możesz także skorzystać z metody writeValue . Moim zdaniem jest to najprostsze rozwiązanie.
Następnie możesz go łatwo odzyskać za pomocą prostej obsady, aby
Boolean
:Pod maską system Android będzie traktował go jako liczbę całkowitą:
źródło
deklarujesz w ten sposób
pisać
czytać
typ logiczny należy przekonwertować na coś, co obsługuje Parcel, abyśmy mogli przekonwertować go na int.
źródło
AndroidStudio (przy użyciu 2,3 atm), po wdrożeniu Parcelable w swojej klasie, możesz po prostu przytrzymać wskaźnik myszy nad nazwą klasy i poprosi Cię o dodanie implementacji paczkowej:
Z czterech pól generuje:
źródło
Zwykle mam je w tablicy i wołam
writeBooleanArray
ireadBooleanArray
Jeśli potrzebujesz jednego logicznego loga, który musisz spakować, możesz to zrobić:
źródło
źródło
Po prostu przejdź do Plik-> Ustawienia-> Wtyczki-> Przeglądaj repozytorium i wyszukaj działkę. Zobacz obraz
Automatycznie utworzy paczkę.
I jest do tego strona internetowa. http://www.parcelabler.com/
źródło
Krótka i prosta implementacja w Kotlinie , z zerowym wsparciem:
Dodaj metody do paczki
I użyj tego:
źródło
Możesz spakować swoje wartości logiczne do bajtu za pomocą maskowania i przesuwania. To byłby najbardziej skuteczny sposób na zrobienie tego i prawdopodobnie tego oczekują od ciebie.
źródło
writeByte()
writeInt()
Trudno tutaj znaleźć prawdziwe pytanie. Myślę, że to jak radzić sobie z logicznymi wartościami przy implementacji
Parcelable
interfejsu.Musisz zapisać wartość jako ciąg znaków lub jako bajt. Jeśli wybierzesz ciąg znaków, będziesz musiał użyć metody statycznej
String
klasy wywoływanejvalueOf()
do parsowania wartości logicznej. Nie jest tak skuteczny, jak zapisywanie go w trudnych bajtach.Jeśli wybierzesz bajt, musisz samodzielnie zaimplementować logikę konwersji.
Podczas demontażu
Parcel
obiektu musisz zadbać o konwersję do oryginalnego typu.źródło
writeByte()
metoda Parcela bezpośrednio wywołujewriteInt()
. Logika konwersji jest zbyt wyczerpująca. Po prostu zróbwriteInt(boolean ? 1 : 0)
iboolean = readInt() != 0
Na to pytanie inni ludzie już doskonale odpowiedzieli, jeśli chcesz to zrobić samodzielnie.
Jeśli wolisz enkapsulować lub ukryć większość niskopoziomowego kodu paczki, możesz rozważyć użycie kodu, który napisałem jakiś czas temu, w celu uproszczenia obsługi paczek.
Pisanie na paczce jest tak proste, jak:
gdzie kolor jest wyliczeniem, a isDriving to na przykład wartość logiczna.
Czytanie z paczki również nie jest trudniejsze:
Wystarczy spojrzeć na „ParceldroidExample”, który dodałem do projektu.
Wreszcie, utrzymuje także krótki czas inicjalizacji CREATOR:
źródło
.class.getClassLoader()
.Istnieje wiele przykładów w źródłach Androida (AOSP). Na przykład
PackageInfo
klasa ma element logicznyrequiredForAllUsers
i jest serializowana w następujący sposób:źródło