2012-07-12 10 views
69

Il android.os.Message utilizza un Bundle da inviare con il metodo sendMessage. Pertanto, è possibile inserire uno HashMap all'interno di uno Bundle?HashMap Android in bundle?

+0

Java e newbie Android 8) thnx a tutti! –

+0

Accetta qualsiasi risposta se abbiamo risolto il tuo problema. thx – AMerle

+3

La soluzione è qui: [Android - Come passare HashMap tra attività?] (http://stackoverflow.com/a/11155142/379693) –

risposta

122

prova come:

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

e nella seconda attività

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

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

perché Hashmap da strumenti predefiniti Serializable in modo da poter passare utilizzando putSerializable in bundle ed entrare in altre attività utilizzando getSerializable

+0

Viene visualizzato un errore quando provo a serializzare la mappa hash collegata. Parcel: impossibile eseguire il marshall value com .SGID.DataClass.InvalidSubscriptionReasonsData @ 41bd2b98 –

+0

Come posso accedere a questo oggetto serializzabile Hash_Map ??? –

+0

@Rani: ancora problema o risolto? –

10

Secondo lo doc, Hashmap strumenti Serializable, quindi è possibile putSerializable Immagino. Hai provato ?

2

Se si desidera inviare tutte le chiavi nel pacchetto, è possibile provare

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

Sono curioso di sapere se c'è qualche ragione per non farlo? Non ho usato molto la serializzazione e mai pacchetti (nuovi per Android), quindi sono curioso di sapere se questo è O (n) e l'aggiunta a un pacchetto è effettivamente O (1) o no. Se non sono diversi nei costi, non vedendo il motivo per cui dovresti preoccuparti di serializzarlo su un'altra mappa. –

4

Nota: Se si utilizza un AppCompatActivity, si dovrà chiamare il metodo protected void onSaveInstanceState(Bundle outState) {} (NONpublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}).

codice di esempio ...

Conservare la mappa:

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

E riceverlo in onCreate:

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

scusate se è una specie di risposta duplicato - forse qualcuno trovalo utile :)

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

Sto utilizzando la mia implementazione kotlin di Parcelable per ottenere ciò e finora funziona per me. Utile se si vuole evitare la serializzazione pesante.

Anche al fine di lavorare vi consiglio di utilizzarlo con these

Dichiarazione

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

} 

Usa

scrittura

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

leggere

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

Non dimenticate che se la vostra mappa K,V non sono parcellizzata di default devono implementare Parcelable