Я пытаюсь сделать ArrayList
Parcelable
, чтобы передать деятельности список пользовательских объектов. Я начинаю писать myObjectList
класс, который расширяет ArrayList<myObject>
и реализует Parcelable
.
Некоторые атрибуты MyObject
есть, boolean
но Parcel
не имеют никакого метода read/writeBoolean
.
Каков наилучший способ справиться с этим?
android
parcelable
grunk
источник
источник
Serializable
интерфейс для взаимодействия между действиями. Это медленно.Ответы:
Вот как я это сделаю ...
writeToParcel:
readFromParcel:
источник
/** * Write a byte value into the parcel at the current dataPosition(), * growing dataCapacity() if needed. */ public final void writeByte(byte val) { writeInt(val); }
writeByte
, но на самом деле пишет int.Вы также можете использовать метод writeValue . На мой взгляд, это самое простое решение.
После этого вы можете легко получить его с помощью простого приведения к
Boolean
:Под капотом Android Framework будет обрабатывать его как целое число:
источник
ты заявляешь вот так
записывать
читать
Булев тип должен быть преобразован во что-то, что поддерживает Parcel, и мы можем преобразовать его в int.
источник
AndroidStudio (с использованием 2,3 атм), после реализации Parcelable в вашем классе, вы можете просто навести указатель мыши на имя класса, и он попросит вас добавить реализацию Parcelable:
Из четырех полей он генерирует следующее:
источник
У меня обычно есть их в массиве и вызов
writeBooleanArray
иreadBooleanArray
Если вам нужно упаковать один логический тип, вы можете сделать это:
источник
источник
Просто зайдите в Файл-> Настройки-> Плагины-> Обзор репозитория и выполните поиск доступных для продажи. См. Изображение
Это автоматически создаст Parcelable.
И для этого есть веб-сайт. http://www.parcelabler.com/
источник
Короткая и простая реализация в Kotlin с поддержкой Nullable:
Добавить методы в Parcel
И использовать это:
источник
Вы можете упаковать свои логические значения в байт, используя маскирование и сдвиг. Это был бы самый эффективный способ сделать это, и, вероятно, это то, что они ожидают от вас.
источник
writeByte()
вызывает напрямуюwriteInt()
Трудно определить реальный вопрос здесь. Я предполагаю, что это как бороться с логическими значениями при реализации
Parcelable
интерфейса.Вам нужно будет либо сохранить значение в виде строки или байта. Если вы выберете строку, вам придется использовать статический метод
String
класса,valueOf()
который вызывается для анализа логического значения. Это не так эффективно, как сохранить его в жестком байте.Если вы выберете байт, вам придется самостоятельно реализовать логику преобразования.
При демонтаже
Parcel
объекта вы должны позаботиться о преобразовании в исходный тип.источник
writeByte()
метод Parcel вызывает напрямуюwriteInt()
. Логика преобразования слишком многословна. Просто сделайwriteInt(boolean ? 1 : 0)
иboolean = readInt() != 0
На этот вопрос уже отлично ответили другие люди, если вы хотите сделать это самостоятельно.
Если вы предпочитаете инкапсулировать или скрывать большую часть кода низкоуровневого парсинга, вы можете рассмотреть возможность использования некоторого кода, который я написал некоторое время назад, для упрощения обработки посылок.
Написать посылку так же просто, как:
где color - это enum, а isDriving - логическое значение, например.
Чтение с посылки тоже не намного сложнее:
Просто взгляните на «ParceldroidExample», который я добавил в проект.
Наконец, он также сокращает инициализатор CREATOR:
источник
.class.getClassLoader()
.Есть много примеров в источниках Android (AOSP). Например,
PackageInfo
класс имеет логический членrequiredForAllUsers
и сериализуется следующим образом:источник