Android HashMap en paquete?


91

El android.os.Messageusa un Bundlepara enviar con su método sendMessage. Por tanto, ¿es posible poner un HashMapinterior a Bundle?


novato en java y android 8) ¡gracias a todos!
Marcus Toepper

Acepte cualquier respuesta si solucionamos su problema. thx
AMerle


Respuestas:


165

intentar como:

Bundle extras = new Bundle();
extras.putSerializable("HashMap",hashMap);
intent.putExtras(extras);

y en segunda actividad

Bundle bundle = this.getIntent().getExtras();

if(bundle != null) {
   hashMap = bundle.getSerializable("HashMap");
}

porque Hashmap se implementa por defecto Serializablepara que pueda pasarlo usando putSerializableen Bundle y obtener otra actividad usandogetSerializable


Recibo un error cuando intento serializar el paquete de mapa hash vinculado: no se puede calcular el valor com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98
SweetWisher ツ

1
¿Puedo usar este método para un objeto que contiene un tipo de datos primitivo y una lista de matriz de otro objeto?
SweetWisher ツ

3
Si tiene problemas, asegúrese de estar utilizando HashMap, no Map
Mateo

1
es posible que desee convertir el objeto serializable devuelto a hashmap de la siguiente manera (HashMap <String, Integer>)
cammando

3
Esto produce una advertencia sobre el lanzamiento no verificado. ¿Es seguro ignorar esto?
mitsest

12

Según el doc , Hashmapimplementos Serializable, así que putSerializablesupongo que puedes . Lo intentaste ?


6

Tenga en cuenta: si está utilizando una AppCompatActivity, tendrá que llamar al método protected void onSaveInstanceState(Bundle outState) {}( NOT public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {} ).

Código de ejemplo ...

Almacenar el mapa:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("leftMaxima", leftMaxima);
    outState.putSerializable("rightMaxima", rightMaxima);
}

Y recíbelo en onCreate:

if (savedInstanceState != null) {
    leftMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("leftMaxima");
    rightMaxima = (HashMap<Long, Float>) savedInstanceState.getSerializable("rightMaxima");
}

Lo siento si es una especie de respuesta duplicada, tal vez alguien la encuentre útil. :)


4

Si desea enviar todas las claves del paquete, puede intentar

for(String key: map.keySet()){
    bundle.putStringExtra(key, map.get(key));
}

Tengo curiosidad por saber si hay alguna razón para no hacer esto. No he usado mucho la serialización y nunca paquetes (nuevo para Android), por lo que tengo curiosidad por saber si esto es O (n) y agregar a un paquete es efectivamente O (1) o no. Si no tienen un costo diferente, no veo por qué se molestaría en serializarlo en otro mapa.
Capitán Prinny

@CaptainPrinny, a menos que el mapa sea lo único que está asignando al paquete, es posible que supere los valores y no sabrá si una clave era parte del mapa original o solo un valor almacenado en el paquete.
Jason

1
  public static Bundle mapToBundle(Map<String, Object> data) throws Exception {
    Bundle bundle = new Bundle();
    for (Map.Entry<String, Object> entry : data.entrySet()) {
        if (entry.getValue() instanceof String)
            bundle.putString(entry.getKey(), (String) entry.getValue());
        else if (entry.getValue() instanceof Double) {
            bundle.putDouble(entry.getKey(), ((Double) entry.getValue()));
        } else if (entry.getValue() instanceof Integer) {
            bundle.putInt(entry.getKey(), (Integer) entry.getValue());
        } else if (entry.getValue() instanceof Float) {
            bundle.putFloat(entry.getKey(), ((Float) entry.getValue()));
        }
    }
    return bundle;
}

1

Estoy usando mi implementación kotlin de Parcelable para lograr eso y hasta ahora me funciona. Es útil si desea evitar los pesados ​​serializables.

También para que funcione, recomiendo usarlo con estos

Declaración

class ParcelableMap<K,V>(val map: MutableMap<K,V>) : Parcelable {
    constructor(parcel: Parcel) : this(parcel.readMap(LinkedHashMap<K,V>()))

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeMap(map)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<ParcelableMap<Any?,Any?>> {
        @JvmStatic
        override fun createFromParcel(parcel: Parcel): ParcelableMap<Any?,Any?> {
            return ParcelableMap(parcel)
        }
        @JvmStatic 
        override fun newArray(size: Int): Array<ParcelableMap<Any?,Any?>?> {
            return arrayOfNulls(size)
        }
    }

}

Utilizar

escribir

val map = LinkedHashMap<Int, String>()
val wrap = ParcelableMap<Int,String>(map)
Bundle().putParcelable("your_key", wrap)

leer

val bundle = fragment.arguments ?: Bundle()
val wrap = bundle.getParcelable<ParcelableMap<Int,String>>("your_key")
val map = wrap.map

No olvide que si su mapa K,Vno está parcelado por defecto, deben implementarParcelable


1
¿Intentaste acortar con @Parcelize?
CoolMind

0

En Kotlin:

hashMap = savedInstanceState?.getSerializable(ARG_HASH_MAP) as? HashMap<Int, ValueClass>

putSerializable(ARG_HASH_MAP, hashMap)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.