97

使用它android.os.MessageBundlesendMessage 方法发送。因此,是否可以将 aHashMap放入 a 中Bundle

4

7 回答 7

176

尝试:

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,所以你可以使用putSerializableBundle 传递它并使用其他活动getSerializable

于 2012-07-12T13:35:43.013 回答
13

根据docHashmapimplements Serializable,所以你可以putSerializable猜到。你试过了吗?

于 2012-07-12T13:29:37.507 回答
6

请注意:如果您使用的是 AppCompatActivity,则必须调用 protected void onSaveInstanceState(Bundle outState) {}( NOT 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");
}

对不起,如果它是某种重复的答案 - 也许有人会发现它很有用。:)

于 2016-08-23T06:06:48.667 回答
4

如果要发送捆绑包中的所有密钥,可以尝试

for(String key: map.keySet()){
    bundle.putStringExtra(key, map.get(key));
}
于 2015-10-24T18:57:05.780 回答
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;
}
于 2018-01-24T07:17:14.877 回答
1

我正在使用我的 Parcelable 的 kotlin 实现来实现这一点,到目前为止它对我有用。如果您想避免繁重的可序列化,这很有用。

另外为了让它工作,我建议将它与这些一起使用

宣言

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)

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

不要忘记,如果您的地图K,V默认未打包,则它们必须实现Parcelable

于 2018-03-02T23:39:57.070 回答
0

在科特林:

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

putSerializable(ARG_HASH_MAP, hashMap)
于 2019-04-17T16:01:19.337 回答