Eu tenho uma atividade que, quando iniciada, precisa acessar duas ArrayLists diferentes. Ambas as listas são objetos diferentes que eu mesmo criei.
Basicamente, preciso de uma maneira de passar esses objetos para a atividade a partir de um Intent. Eu posso usar addExtras (), mas isso requer uma classe compatível com Parceable. Eu poderia fazer minhas aulas serem passadas serializáveis, mas, pelo que entendi, isso atrasa o programa.
Quais são as minhas opções?
Posso passar um Enum?
Como um aparte: existe uma maneira de passar parâmetros para um Construtor de Atividades a partir de uma Intenção?
Respostas:
Esta é uma pergunta antiga, mas todo mundo deixa de mencionar que as Enums são realmente
Serializable
e, portanto, podem ser adicionadas perfeitamente a uma Intenção como um extra. Como isso:A sugestão de usar variáveis estáticas ou de todo o aplicativo é uma péssima idéia. Isso realmente associa suas atividades a um sistema de gerenciamento de estado e é difícil manter, depurar e vincular problemas.
ALTERNATIVAS:
Um bom ponto foi observado por tedzyc sobre o fato de que a solução fornecida pela Oderik gera um erro. No entanto, a alternativa oferecida é um pouco complicada de usar (mesmo usando genéricos).
Se você está realmente preocupado com o desempenho de adicionar a enum a uma intenção, proponho essas alternativas:
OPÇÃO 1:
Uso:
OPÇÃO 2: (genérica, reutilizável e dissociada da enumeração)
Uso:
OPÇÃO 3 (com Kotlin):
Já faz um tempo, mas como agora temos o Kotlin, pensei em adicionar outra opção para o novo paradigma. Aqui, podemos usar funções de extensão e tipos reificados (que mantêm o tipo ao compilar).
Existem alguns benefícios em fazê-lo dessa maneira.
inline
qual substituirá as chamadas pelo código dentro da função.Uma das desvantagens é que, se mudarmos a ordem dos Emums, qualquer referência antiga não funcionará. Isso pode ser um problema com coisas como Intents dentro de intenções pendentes, pois elas podem sobreviver a atualizações. No entanto, pelo resto do tempo, deve estar ok.
É importante observar que outras soluções, como usar o nome em vez da posição, também falharão se renomearmos qualquer um dos valores. Embora, nesses casos, recebamos uma exceção em vez do valor incorreto do Enum.
Uso:
fonte
enum class
tipos em um Java simplesenum
. Acho que a solução mais fácil é tornar oenum class
implementoSerializable
:enum class AwesomeEnum : Serializable { A, B, C }
não é o ideal, mas deve funcionar.Você pode fazer seu enum implementar Parcelable, o que é bastante fácil para enumerações:
Você pode usar Intent.putExtra (String, Parcelable).
ATUALIZAÇÃO: Observe o comentário de wreckgar que
enum.values()
aloca uma nova matriz a cada chamada.ATUALIZAÇÃO: o Android Studio possui um modelo ativo
ParcelableEnum
que implementa esta solução. (No Windows, use Ctrl+ J)fonte
Você pode passar um enum como uma string.
Dadas seqüências de caracteres são suportadas, você deve ser capaz de passar o valor do enum sem nenhum problema.
fonte
Para passar uma enum por intenção, você pode converter enum em número inteiro.
Ex:
Enviando (enum para inteiro):
Recebendo (inteiro para enum):
Cumprimentos. :)
fonte
Se você realmente precisar, pode serializar uma enumeração como uma String, usando
name()
evalueOf(String)
, da seguinte maneira:Obviamente, isso não funciona se seus enums tiverem um estado mutável (o que não deveriam, na verdade).
fonte
Pode ser possível fazer seu Enum implementar Serializable, então você pode passá-lo através do Intent, pois existe um método para transmiti-lo como serializável. O conselho para usar int em vez de enum é falso. As enums são usadas para facilitar a leitura e a manutenção do código. Seria um grande passo para trás na idade das trevas para não poder usar Enums.
fonte
sobre a publicação de Oderik:
Se você definir uma variável MyEnum myEnum, faça intent.putExtra ("Parcelable1", myEnum), você receberá uma mensagem de erro "O método putExtra (String, Parcelable) é ambíguo para o tipo Intent". porque também existe um método Intent.putExtra (String, Parcelable) e o próprio tipo 'Enum' implementa a interface Serializable, portanto, o compilador não sabe escolher qual método (intent.putExtra (String, Parcelable / ou Serializable)).
Sugira que remova a interface Parcelable do MyEnum e mova o código principal para a implementação Parcelable da classe wrap, como esta (o Father2 é um Parcelable e contém um campo enum):
então nós podemos fazer:
fonte
intent.putExtra("myEnum", (Parcelable) enumValue);
bundle.putExtra("key", AnotherEnum.X.ordinal())
.você pode usar o construtor enum para que o enum tenha um tipo de dados primitivo.
você pode usar para passar int como extras e retirá-lo do enum usando seu valor.
fonte
A maioria das respostas que estão usando o conceito Parcelable aqui está em código Java. É mais fácil fazê-lo no Kotlin.
Apenas anote sua classe enum com @Parcelize e implemente a interface Parcelable.
fonte
Eu gosto de simples
HAPPY
eSAD
.IntentFactory
que crie o seuIntent
para você. Passe oMode
que quiser.IntentFactory
usa o nome daMode
classe como o nome do extra.IntentFactory
converteMode
para umString
usandoname()
onCreate
uso, essas informações serão convertidas novamente em aMode
.Você poderia usar
ordinal()
eMode.values()
também. Eu gosto de strings porque posso vê-las no depurador.fonte
Acho que sua melhor aposta será converter essas listas em algo que pode ser parcelado, como uma string (ou mapa?) Para levá-la à Atividade. Então a Atividade precisará convertê-lo novamente em uma matriz.
Implementar encomendas personalizadas é uma dor no pescoço IMHO, então eu evitaria se possível.
fonte
Considere a seguir enum ::
Para passar ::
Para recuperar de volta a intenção / pacote configurável / argumentos:
fonte
Se você apenas deseja enviar uma enumeração, pode fazer algo como:
Primeiro, declare uma enum contendo algum valor (que pode ser passado através da intenção):
Então:
E quando você quiser obtê-lo:
Pedaco de bolo!
fonte
Use as funções de extensão Kotlin
Isso oferece a flexibilidade de passar vários do mesmo tipo de enumeração ou usar como padrão o nome da classe.
fonte
Não use enums. Razão # 78 para não usar enumerações. :) Use números inteiros, que podem ser facilmente remotos através de Bundle e Parcelable.
fonte
mEnum.ordinal()
? é retornar a posição do elementoEnum.ordinal()
é fixo no tempo de compilação. O único momento em que esse comentário se aplica seria a transferência de dados entre aplicativos com versões diferentes da enumeração ou através de atualizações de aplicativos que alteram a ordem dos elementos na enumeração. Esse tipo de coisa é perigosa sempre que você usa algo que não é primitivo. Para passar intenções entre atividades em um único aplicativo,Enum.ordinal()
deve ser totalmente seguro.