Tengo una actividad que cuando se inicia necesita acceso a dos ArrayLists diferentes. Ambas listas son objetos diferentes que yo mismo he creado.
Básicamente, necesito una forma de pasar estos objetos a la actividad desde un intento. Puedo usar addExtras () pero esto requiere una clase compatible con Parceable. Podría hacer que mis clases se pasen serializables pero, según tengo entendido, esto ralentiza el programa.
¿Cuáles son mis opciones?
¿Puedo pasar una enumeración?
Como comentario: ¿hay alguna manera de pasar parámetros a un Constructor de actividades desde una Intención?
Respuestas:
Esta es una vieja pregunta, pero todos no mencionan que Enums son realmente
Serializable
y, por lo tanto, se pueden agregar perfectamente a un Intent como extra. Me gusta esto:La sugerencia de usar variables estáticas o de toda la aplicación es una muy mala idea. Esto realmente combina sus actividades con un sistema de gestión de estado, y es difícil de mantener, depurar y resolver problemas.
ALTERNATIVAS:
Tedzyc señaló un buen punto sobre el hecho de que la solución proporcionada por Oderik le da un error. Sin embargo, la alternativa ofrecida es un poco engorrosa de usar (incluso con genéricos).
Si realmente le preocupa el rendimiento de agregar la enumeración a una intención, le propongo estas alternativas:
OPCIÓN 1:
Uso:
OPCIÓN 2: (genérico, reutilizable y desacoplado de la enumeración)
Uso:
OPCIÓN 3 (con Kotlin):
Ha pasado un tiempo, pero desde ahora tenemos a Kotlin, pensé que agregaría otra opción para el nuevo paradigma. Aquí podemos hacer uso de funciones de extensión y tipos reified (que retiene el tipo al compilar).
Hay algunos beneficios de hacerlo de esta manera.
inline
cual reemplazará las llamadas con el código dentro de la función.Una de las desventajas es que, si cambiamos el orden de los Emums, cualquier referencia anterior no funcionará. Esto puede ser un problema con cosas como Intentos dentro de intentos pendientes, ya que pueden sobrevivir a las actualizaciones. Sin embargo, por el resto del tiempo, debería estar bien.
Es importante tener en cuenta que otras soluciones, como usar el nombre en lugar de la posición, también fallarán si cambiamos el nombre de cualquiera de los valores. Aunque, en esos casos, obtenemos una excepción en lugar del valor incorrecto Enum.
Uso:
fuente
enum class
tipos en un Java simpleenum
. Supongo que la solución más fácil es hacer elenum class
implementoSerializable
:enum class AwesomeEnum : Serializable { A, B, C }
no es ideal, pero debería funcionar.Puede hacer que su enumeración implemente Parcelable, que es bastante fácil para las enumeraciones:
Luego puede usar Intent.putExtra (String, Parcelable).
ACTUALIZACIÓN: tenga en cuenta el comentario de wreckgar que
enum.values()
asigna una nueva matriz en cada llamada.ACTUALIZACIÓN: Android Studio presenta una plantilla en vivo
ParcelableEnum
que implementa esta solución. (En Windows, use Ctrl+ J)fuente
Puede pasar una enumeración como una cadena.
Las cadenas dadas son compatibles, debería poder pasar el valor de la enumeración sin ningún problema.
fuente
Para pasar una enumeración por intención, puede convertir la enumeración en entero.
Ex:
Envío (enum a entero):
Recibiendo (entero a enum):
Atentamente. :)
fuente
Si realmente lo necesita, puede serializar una enumeración como una Cadena, usando
name()
yvalueOf(String)
, de la siguiente manera:Obviamente, esto no funciona si sus enumeraciones tienen un estado mutable (que en realidad no deberían).
fuente
Es posible hacer que su Enum implemente Serializable, luego puede pasarlo a través de Intent, ya que hay un método para pasarlo como serializable. El consejo de usar int en lugar de enum es falso. Las enumeraciones se utilizan para hacer que su código sea más fácil de leer y más fácil de mantener. Sería un gran paso atrás en la edad oscura no poder usar Enums.
fuente
sobre la publicación de Oderik:
Si define una variable MyEnum myEnum, luego haga intent.putExtra ("Parcelable1", myEnum), obtendrá un mensaje de error "El método putExtra (String, Parcelable) es ambiguo para el tipo Intent". porque también hay un método Intent.putExtra (String, Parcelable), y el tipo original 'Enum' implementa la interfaz serializable, por lo que el compilador no sabe elegir qué método (intent.putExtra (String, Parcelable / o Serializable)).
Sugiera que elimine la interfaz Parcelable de MyEnum y mueva el código central a la implementación Parcelable de la clase wrap, de esta manera (Father2 es Parcelable y contiene un campo enum):
entonces podemos hacer:
fuente
intent.putExtra("myEnum", (Parcelable) enumValue);
bundle.putExtra("key", AnotherEnum.X.ordinal())
.puede usar el constructor enum para que enum tenga un tipo de datos primitivo.
puede usar para pasar int como extras y luego extraerlo de enum usando su valor.
fuente
La mayoría de las respuestas que utilizan el concepto Parcelable aquí están en código Java. Es más fácil hacerlo en Kotlin.
Simplemente anote su clase de enumeración con @Parcelize e implemente la interfaz Parcelable.
fuente
Me gusta simple
HAPPY
ySAD
.IntentFactory
que cree suIntent
para usted. Pásalo comoMode
quieras.IntentFactory
utiliza el nombre de laMode
clase como el nombre de la extra.IntentFactory
convierte elMode
a unString
usoname()
onCreate
uso esta información para volver a convertir aMode
.Podrías usar
ordinal()
yMode.values()
también. Me gustan las cadenas porque puedo verlas en el depurador.fuente
Creo que su mejor opción será convertir esas listas en algo parcelable, como una cadena (¿o un mapa?) Para llevarlo a la Actividad. Luego, la Actividad tendrá que convertirla nuevamente en una matriz.
Implementar parcelables personalizados es un dolor en el cuello en mi humilde opinión, por lo que lo evitaría si es posible.
fuente
Considere seguir enum ::
Por pasar ::
Para recuperar de la intención / paquete / argumentos ::
fuente
Si solo desea enviar una enumeración, puede hacer algo como:
Primero declare una enumeración que contenga algún valor (que se puede pasar por intento):
Luego:
Y cuando quieras obtenerlo:
Pedazo de pastel!
fuente
Utilice las funciones de extensión de Kotlin
Esto le brinda la flexibilidad de pasar múltiples del mismo tipo de enumeración, o el uso predeterminado del nombre de la clase.
fuente
No uses enumeraciones. Razón # 78 para no usar enumeraciones. :) Use números enteros, que pueden ser remotos fácilmente a través de Bundle y Parcelable.
fuente
mEnum.ordinal()
? es devolver la posición del elementoEnum.ordinal()
se fija en tiempo de compilación. El único momento en que se aplica el comentario sería pasar datos entre aplicaciones con diferentes versiones de la enumeración, o entre actualizaciones de aplicaciones que cambian el orden de los elementos dentro de la enumeración. Ese tipo de cosas es peligroso cuando usas cualquier cosa que no sea primitiva. Para pasar intentos entre actividades dentro de una sola aplicación,Enum.ordinal()
debe ser completamente seguro.