Bundle中的Android HashMap?

Posted

技术标签:

【中文标题】Bundle中的Android HashMap?【英文标题】:Android HashMap in Bundle? 【发布时间】:2012-07-12 06:19:49 【问题描述】:

android.os.Message 使用 Bundle 通过它的 sendMessage 方法发送。因此,是否可以将HashMap 放在Bundle 中?

【问题讨论】:

java 和 android 新手 8) 谢谢大家! 如果我们解决了您的问题,请接受任何答案。谢谢 解决方案在这里:Android - How to pass HashMap<String,String> between activities? Android - How to pass HashMap<String,String> between activities?的可能重复 什么是HashMap>? 【参考方案1】:

尝试:

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,所以您可以在Bundle 中使用putSerializable 传递它,并使用getSerializable 进入其他活动

【讨论】:

尝试序列化链接的哈希映射 Parcel 时出现错误:无法编组值 com.SGID.DataClass.InvalidSubscriptionReasonsData@41bd2b98 我可以将这个方法用于包含原始数据类型和另一个对象的数组列表的对象吗?? 如果您遇到问题,请确保您使用的是 HashMap 而不是 Map 您可能希望通过以下方式将返回的可序列化对象转换为 hashmap (HashMap) 这会产生有关未经检查的演员表的警告。这可以忽略吗?【参考方案2】:

根据doc,Hashmap实现Serializable,所以你可以putSerializable我猜。你试过了吗?

【讨论】:

【参考方案3】:

请注意:如果您使用的是 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");

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

我很好奇是否有任何理由不这样做?我没有太多使用序列化,也从不捆绑(android 新手),所以我很好奇这是否是 O(n) 并且附加到捆绑包实际上是否是 O(1)。如果它们的成本没有什么不同,那就不明白你为什么要费心将它序列化到另一个地图中。 @CaptainPrinny 除非地图是您映射到捆绑包的唯一内容,否则您可能会破坏值并且您不知道键是原始地图的一部分还是只是存储在捆绑。【参考方案5】:
  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;

【讨论】:

【参考方案6】:

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

另外,为了让它工作,我建议将它与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)

阅读

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

不要忘记,如果你的地图K,V默认没有打包,他们必须实现Parcelable

【讨论】:

您是否尝试使用@Parcelize 缩短?【参考方案7】:

在 Kotlin 中:

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

putSerializable(ARG_HASH_MAP, hashMap)

【讨论】:

以上是关于Bundle中的Android HashMap?的主要内容,如果未能解决你的问题,请参考以下文章

Android中的Bundle问题

如何使用来自 Arraylist<Hashmap<String,String>> 的 bundle 获取使用 putserializable 传递的值

Android:无法保存和读取 Bundle 中的所有值

简要分析Android中的Intent,Bundle,Parcel中的数据传递

简要分析Android中的Intent,Bundle,Parcel中的数据传递

用于 android 开发的 adt-bundle 中的 Eclipse 通过自动完成冻结