У меня есть активность, что при запуске нужен доступ к двум различным спискам ArrayLists. Оба списка - это разные объекты, которые я создал сам.
По сути, мне нужен способ передать эти объекты в действие из намерения. Я могу использовать addExtras (), но для этого требуется совместимый класс Parceable. Я могу сделать так, чтобы мои классы передавались сериализуемо, но, насколько я понимаю, это замедляет работу программы.
Какие у меня варианты?
Могу ли я передать Enum?
Как отступление: есть ли способ передать параметры в конструктор операций из намерения?
Ответы:
Это старый вопрос, но все не упоминают, что Enums на самом деле
Serializable
и, следовательно, могут быть добавлены в Intent в качестве дополнительного. Как это:Предложение использовать статические переменные или переменные всего приложения - действительно плохая идея. Это действительно связывает вашу деятельность с системой управления состоянием, и ее трудно поддерживать, отлаживать и решать проблемы.
АЛЬТЕРНАТИВЫ:
Тедзик отметил хороший момент в том, что решение, предоставленное Oderik, дает вам ошибку. Тем не менее, предлагаемая альтернатива немного громоздка в использовании (даже с использованием дженериков).
Если вы действительно беспокоитесь о возможности добавления enum к Intent, я предлагаю вместо этого следующие варианты:
ОПЦИЯ 1:
Использование:
ВАРИАНТ 2: (универсальный, многократно используемый и отделенный от перечисления)
Использование:
ВАРИАНТ 3 (с Kotlin):
Это было давно, но с тех пор, как у нас появился Kotlin, я подумал, что добавлю еще одну опцию для новой парадигмы. Здесь мы можем использовать функции расширения и reified-типы (которые сохраняют тип при компиляции).
Есть несколько преимуществ сделать это таким образом.
inline
чему вызовы заменяются кодом внутри функции.Одним из недостатков является то, что если мы изменим порядок Emums, то любая старая ссылка не будет работать. Это может быть проблемой с такими вещами, как Intents внутри ожидаемых намерений, поскольку они могут пережить обновления. Однако в остальное время все должно быть в порядке.
Важно отметить, что другие решения, такие как использование имени вместо позиции, также потерпят неудачу, если мы переименуем любое из значений. Хотя в этих случаях вместо неправильного значения Enum мы получаем исключение.
Использование:
источник
enum class
типы в простую Javaenum
. Я полагаю, что более простой обходной путь - сделатьenum class
инструментSerializable
:enum class AwesomeEnum : Serializable { A, B, C }
не идеальный, но должен работать.Вы можете заставить свой enum реализовывать Parcelable, что довольно просто для перечислений:
Затем вы можете использовать Intent.putExtra (String, Parcelable).
ОБНОВЛЕНИЕ: Обратите внимание на комментарий wreckgar, который
enum.values()
выделяет новый массив при каждом вызове.ОБНОВЛЕНИЕ: Android Studio имеет живой шаблон,
ParcelableEnum
который реализует это решение. (В Windows используйте Ctrl+ J)источник
Вы можете передать перечисление в виде строки.
Данные строки поддерживаются, вы должны быть в состоянии передать значение перечисления без проблем.
источник
Для передачи enum по назначению вы можете преобразовать enum в целое число.
Пример:
Отправка (перечисление в целое число):
Получение (целое число для перечисления):
С уважением. :)
источник
Если вам действительно нужно, вы можете сериализовать enum как String, используя
name()
иvalueOf(String)
, следующим образом:Это, очевидно, не работает, если ваши перечисления имеют изменяемое состояние (что на самом деле не должно).
источник
Может быть возможно сделать ваш Enum реализующим Serializable, тогда вы можете передать его через Intent, так как есть метод для передачи его в качестве сериализуемого. Совет использовать int вместо enum - фальшивка. Перечисления используются, чтобы сделать ваш код легче для чтения и поддержки. Это было бы большим шагом назад в темные века, чтобы не иметь возможности использовать Enums.
источник
о посте Одерика:
Если вы определите переменную MyEnum myEnum, а затем выполните intent.putExtra («Parcelable1», myEnum), вы получите «Метод putExtra (String, Parcelable) неоднозначен для сообщения об ошибке типа Intent». поскольку есть также метод Intent.putExtra (String, Parcelable), а сам оригинальный тип Enum реализует интерфейс Serializable, поэтому компилятор не знает, какой метод выбрать (intent.putExtra (String, Parcelable / или Serializable)).
Предложите удалить интерфейс Parcelable из MyEnum и переместить основной код в реализацию Parcelable класса wrap, например, так (Father2 - Parcelable и содержит поле enum):
тогда мы можем сделать:
источник
intent.putExtra("myEnum", (Parcelable) enumValue);
bundle.putExtra("key", AnotherEnum.X.ordinal())
.Вы можете использовать конструктор enum для enum, чтобы иметь примитивный тип данных.
Вы можете использовать, чтобы передать int как дополнительные функции, а затем извлечь его из enum, используя его значение.
источник
Большинство ответов, использующих концепцию Parcelable, приведены в коде Java. Это проще сделать в Котлине.
Просто аннотируйте свой enum класс с помощью @Parcelize и реализуйте интерфейс Parcelable.
источник
Мне нравится просто.
HAPPY
иSAD
.IntentFactory
который создает вашIntent
для вас. Передайте этоMode
вы хотите.IntentFactory
Использует имя изMode
класса как имя дополнительного.IntentFactory
преобразуетMode
кString
используяname()
onCreate
использование этой информации, чтобы преобразовать обратно вMode
.Вы могли бы использовать
ordinal()
иMode.values()
так же. Мне нравятся строки, потому что я вижу их в отладчике.источник
Я думаю, что вам лучше всего будет преобразовать эти списки во что-нибудь, например строку (или карту?), Чтобы получить его в Activity. Затем Activity должен будет преобразовать его обратно в массив.
Реализация пользовательских посылок - это боль в шее, ИМХО, поэтому я бы избегал этого, если это возможно.
источник
Рассмотрим следующее enum:
Для прохождения ::
Чтобы получить обратно из намерения / пакета / аргументов ::
источник
Если вы просто хотите отправить enum, вы можете сделать что-то вроде:
Сначала объявите перечисление, содержащее некоторое значение (которое может быть передано через намерение):
Затем:
И когда вы хотите получить это:
Кусок пирога!
источник
Используйте функции расширения Kotlin
Это дает вам возможность передавать несколько одинаковых типов перечислений или по умолчанию использовать имя класса.
источник
Не используйте перечисления. Причина № 78 не использовать перечисления. :) Используйте целые числа, которые можно легко удалить с помощью Bundle и Parcelable.
источник
mEnum.ordinal()
? это вернуть положение элементаEnum.ordinal()
фиксируется во время компиляции. Единственный момент, когда применяется комментарий, - это передача данных между приложениями с различными версиями перечисления или между обновлениями приложений, которые изменяют порядок элементов в перечислении. Подобные вещи опасны, когда вы используете что-то, что не является примитивным. Для передачи намерений между действиями в рамках одного приложения,Enum.ordinal()
должны быть полностью безопасными.