2012-07-12 43 views
69

android.os.Message使用Bundle發送它的sendMessage方法。因此,是否有可能將HashMap放入BundleAndroid HashMap in Bundle?

+0

日Thnx所有Java和Android新手8)! – 2012-07-12 13:35:05

+0

如果我們解決了您的問題,請接受任何答案。 thx – AMerle 2012-07-12 13:37:21

+3

解決方法是在這裏:[Android的 - 如何通過HashMap 之間的活動?](http://stackoverflow.com/a/11155142/379693) – 2012-07-12 13:37:46

回答

122

嘗試爲:

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

,並在第二活動

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

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

因爲Hashmap默認工具Serializable這樣你就可以使用putSerializable捆綁傳遞和其他活動獲得使用getSerializable

+0

我嘗試序列化鏈接的哈希映射時出現錯誤包裹:無法封送值com .SGID.DataClass.InvalidSubscriptionReasonsData @ 41bd2b98 – 2013-10-04 11:48:03

+0

我該如何訪問這個可序列化的對象Hash_Map ??? – 2013-10-04 12:01:20

+0

@Rani:仍然有問題或解決? – 2013-10-04 16:39:38

10

根據doc,Hashmap implements Serializable,所以你可以putSerializable我猜。你試過了嗎?

2

如果你想發送捆綁中的所有密鑰,你可以嘗試

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

我很好奇,如果有任何理由不這樣做?我沒有使用過多的序列化,也沒有捆綁(新的android),所以我很好奇,如果這是O(n)並且附加到一個捆綁包實際上是O(1)或不是。 如果他們在成本方面沒有差異,不會看到爲什麼要將它序列化到另一個地圖中。 – 2016-02-15 23:07:23

4

請注意:如果您使用的是AppCompatActivity,你將不得不調用 protected void onSaveInstanceState(Bundle outState) {}public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {})方法。

示例代碼...

商店地圖:

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

而在的onCreate接受它:

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

很抱歉,如果它是某種重複的答案 - 也許有人會覺得很有用。 :)

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

我正在使用我的kotlin Parcelable的實現來實現這一點,迄今爲止它適用於我。 有用的,如果你想避免重序列化。

爲了工作,我建議用 these

宣言

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

} 

使用

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

閱讀

使用它

而且

不要忘記,如果你的地圖K,V默認情況下不瓜分,他們必須實現Parcelable