Saya mencoba untuk membuat ArrayList
Parcelable
agar suatu aktivitas dapat mengirimkan daftar objek khusus. Saya mulai menulis myObjectList
kelas yang diperluas ArrayList<myObject>
dan diimplementasikan Parcelable
.
Beberapa atribut MyObject
are boolean
tetapi Parcel
tidak memiliki metode apa pun read/writeBoolean
.
Apa cara terbaik untuk menangani ini?
android
parcelable
grunk
sumber
sumber
Serializable
antarmuka untuk komunikasi antar aktivitas. Itu lambat.Jawaban:
Begini cara saya melakukannya ...
writeToParcel:
readFromParcel:
sumber
/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }
writeByte
, tetapi sebenarnya menulis int.Anda juga dapat menggunakan metode writeValue . Menurut pendapat saya itu solusi yang paling mudah.
Setelah itu Anda dapat dengan mudah mengambilnya dengan gips sederhana ke
Boolean
:Di bawah tenda Kerangka Android akan menanganinya sebagai bilangan bulat:
sumber
Anda menyatakan seperti ini
menulis
Baca
tipe boolean perlu dikonversi ke sesuatu yang didukung Parcel dan agar kita dapat mengubahnya menjadi int.
sumber
AndroidStudio (menggunakan 2,3 atm), setelah menerapkan Parcelable di kelas Anda, Anda dapat dengan mudah memegang pointer mouse di atas nama kelas Anda dan meminta Anda untuk menambahkan implementasi parcelable:
Dari empat bidang, ini menghasilkan yang berikut:
sumber
Saya biasanya memilikinya dalam sebuah array dan panggilan
writeBooleanArray
danreadBooleanArray
Jika itu adalah boolean tunggal yang harus Anda bungkus, Anda bisa melakukan ini:
sumber
sumber
Cukup buka File-> Pengaturan-> Plugins-> Browse Repository dan cari parcelable. Lihat gambar
Ini akan secara otomatis membuat Parcelable.
Dan ada webiste juga untuk melakukan ini. http://www.parcelabler.com/
sumber
Implementasi singkat dan sederhana di Kotlin , dengan dukungan nullable:
Tambahkan metode ke Parcel
Dan gunakan itu:
sumber
Anda bisa mengemas nilai boolean Anda ke dalam byte menggunakan masking dan shifting. Itu akan menjadi cara paling efisien untuk melakukannya dan mungkin itulah yang mereka harapkan Anda lakukan.
sumber
writeByte()
langsung memanggilwriteInt()
Sulit untuk mengidentifikasi pertanyaan sebenarnya di sini. Saya kira itu adalah bagaimana berurusan dengan boolean saat mengimplementasikan
Parcelable
antarmuka.Anda harus menyimpan nilai sebagai string atau sebagai byte. Jika Anda mencari string maka Anda harus menggunakan metode statis dari
String
kelas yang dipanggilvalueOf()
untuk mem-parsing nilai boolean. Ini tidak seefektif menyimpannya dalam byte yang sulit.Jika Anda menggunakan byte, Anda harus mengimplementasikan sendiri logika konversi.
Saat menghapus
Parcel
objek, Anda harus menjaga konversi ke tipe aslinya.sumber
writeByte()
langsung memanggilwriteInt()
. Logika konversi terlalu bertele-tele. LakukanwriteInt(boolean ? 1 : 0)
danboolean = readInt() != 0
Pertanyaan ini sudah dijawab dengan sempurna oleh orang lain, jika Anda ingin melakukannya sendiri.
Jika Anda lebih memilih untuk merangkum atau menyembunyikan sebagian besar kode parcel tingkat rendah, Anda dapat mempertimbangkan menggunakan beberapa kode yang saya tulis beberapa waktu lalu untuk menyederhanakan penanganan parcelable.
Menulis ke paket semudah:
di mana warna adalah enum dan isDriving adalah boolean, misalnya.
Membaca dari parsel juga tidak jauh lebih sulit:
Lihat saja "ParceldroidExample" yang saya tambahkan ke proyek.
Akhirnya, itu juga membuat initializer CREATOR singkat:
sumber
.class.getClassLoader()
.Ada banyak contoh di sumber Android (AOSP). Sebagai contoh,
PackageInfo
kelas memiliki anggota booleanrequiredForAllUsers
dan diserialisasi sebagai berikut:sumber