2012-07-12 18 views
69

Urządzenie android.os.Message używa Bundle do wysyłania przy użyciu metody sendMessage. Dlatego czy możliwe jest umieszczenie HashMap wewnątrz Bundle?Android HashMap w pakiecie?

+0

Java i Android początkujących 8) thnx dla wszystkich! –

+0

Zaakceptuj każdą odpowiedź, jeśli rozwiążemy Twój problem. thx – AMerle

+3

Rozwiązanie jest tutaj: [Android - jak przekazać HashMap między działaniami?] (http://stackoverflow.com/a/11155142/379693) –

Odpowiedz

122

try jak:

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

aw drugim Aktywny

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

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

ponieważ Hashmap domyślnie narzędzi Serializable więc można przekazać go za pomocą putSerializable w Bundle i dostać w innej aktywności za pomocą getSerializable

+0

Otrzymuję komunikat o błędzie, gdy próbuję serializować powiązaną mapę haszującą Parcel: nie można marnować wartości com .SGID.DataClass.InvalidSubscriptionReasonsData @ 41bd2b98 –

+0

Jak mogę uzyskać dostęp do tego serializowalnego obiektu Hash_Map ??? –

+0

@Rani: nadal otrzymujesz problem lub rozwiązany? –

10

Zgodnie z doc, Hashmap implementuje Serializable, dzięki czemu można putSerializable Chyba. Spróbowałeś?

2

Jeśli chcesz wysłać wszystkie klucze w pakiecie, możesz spróbować

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

Jestem ciekawy, czy nie ma powodu, aby tego nie robić? Nie używałem zbyt wiele serializacji i nigdy nie pakowałem (nowe na Androida), więc jestem ciekawy, czy to jest O (n), a dołączanie do pakietu jest efektywnie O (1) czy nie. Jeśli nie różnią się one kosztem, nie widzą powodu, dla którego mielibyśmy kłopot z serializowaniem go na inną mapę. –

4

Uwaga: Jeśli używasz AppCompatActivity, trzeba będzie wywołać metodę protected void onSaveInstanceState(Bundle outState) {} (NIEpublic void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}).

Przykład kod ...

Store mapa:

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

i odbierać go w onCreate:

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

Przepraszam, jeśli to jakiś duplikatu odpowiedzi - może ktoś będzie znaleźć to przydatne. :)

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

Używam mojej kotlinskiej implementacji Parceli, aby to osiągnąć i jak na razie działa to dla mnie. Przydatne, jeśli chcesz uniknąć ciężkich serializacji.

także aby pracować polecam go używać z these

Deklaracji

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

} 

Zastosowanie

zapisu

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

czytać

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

nie należy zapominać, że jeśli mapa K,V nie są zapakowane domyślnie muszą wdrożyć Parcelable