2012-07-12 126 views
69

El android.os.Message usa un Bundle para enviar con su método sendMessage. Por lo tanto, ¿es posible poner un HashMap dentro de un Bundle?Android HashMap en Bundle?

+0

Java y Android novato 8) thnx a todos! –

+0

Acepte cualquier respuesta si hemos resuelto su problema. thx – AMerle

+3

La solución está aquí: [Android - ¿Cómo pasar HashMap entre actividades?] (http://stackoverflow.com/a/11155142/379693) –

Respuesta

122

prueba como:

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

y en la segunda actividad

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

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

porque Hashmap por implementos defecto Serializable lo que puede pasar que el uso de putSerializable en paquete y entrar en otra actividad utilizando getSerializable

+0

Recibo un error al tratar de serializar el mapa hash vinculado Parcel: no se puede ordenar el valor com .SGID.DataClass.InvalidSubscriptionReasonsData @ 41bd2b98 –

+0

¿Cómo puedo acceder a este objeto serializable Hash_Map ??? –

+0

@Rani: ¿aún tiene problemas o está resuelto? –

10

De acuerdo con doc, Hashmap implementa Serializable, por lo que puede putSerializable supongo. Lo intentaste ?

2

Si desea enviar todas las llaves del paquete, puede intentar

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

Tengo curiosidad si hay alguna razón para no hacer esto? No he utilizado mucho la serialización, y nunca agrupa (nuevo en android), así que tengo curiosidad si esto es O (n) y anexar a un paquete es efectivamente O (1) o no. Si no son diferentes en costo, no ve por qué te molestarías en serializarlo en otro mapa. –

4

Nota: Si está utilizando un AppCompatActivity, tendrá que llamar al método protected void onSaveInstanceState(Bundle outState) {} (NOpublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}).

código Ejemplo ...

tienda el mapa:

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

y recibirlo en onCreate:

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

sentimos si se trata de algún tipo de respuesta duplicado - tal vez alguien lo encuentra útil. :)

0
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; 
} 
0

Estoy usando la implementación de mine kotlin de Parcelable para lograr eso y hasta ahora me funciona. Útil si quiere evitar el pesado serializable.

también con el fin de trabajar recomiendo usarlo con these

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) 
     } 
    } 

} 

Uso

escritura

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 se olvide que si su mapa K,V no están repartido por defecto que deben implementar Parcelable