Android中的Bundle中使用HashMap?

106

android.os.Message使用Bundle在其sendMessage方法中进行发送。因此,是否可以将HashMap放到Bundle中?


Java和Android新手 8) 感谢大家! - Marcus Toepper
如果我们解决了您的问题,请接受任何答案。谢谢。 - AMerle
3
解决方案在这里:Android - 如何在活动之间传递HashMap<String,String>? - Paresh Mayani
可能是重复的问题:Android - 如何在活动之间传递HashMap<String,String>? - Andre Bossard
如果有一个HashMap<String,List<String>>,那会是什么? - RamPrasadBismil
7个回答

186

尝试如下:

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

并且在第二个Activity中

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

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

因为 HashMap 默认实现了Serializable接口,所以您可以使用putSerializable将其传递到Bundle中,并在其他Activity中使用getSerializable获取。


当我尝试序列化链式哈希映射时,出现了错误 Parcel:无法编组值com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98 - SweetWisher ツ
1
我可以使用这种方法来处理包含基本数据类型和另一个对象的数组列表的对象吗? - SweetWisher ツ
3
如果你遇到问题,请确保使用的是 HashMap 而不是 Map。 - Matthew
2
你可能想通过以下方式将返回的可序列化对象转换为HashMap(String,Integer):(HashMap<String, Integer>) - cammando
4
这会产生一个未经检查的转换警告。忽略它是否安全? - mitsest

14
根据文档Hashmap实现了Serializable接口,所以您可以尝试使用putSerializable方法。

6
请注意:如果您正在使用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");
}

如果这是某种重复的回答,很抱歉 - 也许有人会发现它有用。 :)


5

如果您想发送捆绑中的所有键,您可以尝试

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

我很好奇是否有任何理由不这样做?我很少使用序列化,也从未使用过bundles(对Android来说是新的),所以我很好奇这是否是O(n),并且将一个bundle附加到另一个bundle是否有效地是O(1)。如果它们的成本没有区别,那么我不明白为什么要将其序列化到另一个map中。 - Captain Prinny
@CaptainPrinny,除非地图是您映射到包中的唯一内容,否则您可能会覆盖值,并且您将不知道某个键是否是原始地图的一部分,还是仅存储在包中的一个值。 - Jason

1
我正在使用我的Kotlin Parcelable实现来实现这一点,目前对我很有效。 如果您想避免繁重的可序列化,这将非常有用。
此外,为了使其工作,我建议与这些一起使用。
声明
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

1
你尝试过使用 @Parcelize 来缩短代码吗? - CoolMind

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

0

用Kotlin编写:

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

putSerializable(ARG_HASH_MAP, hashMap)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接